问题 为什么使用return作为函数中的最后一个语句被认为是错误的样式?


我正在阅读Rust文档,并遇到了以下示例和声明

使用return作为函数的最后一行有效,但被认为是糟糕的样式:

fn foo(x: i32) -> i32 {
    if x < 5 { return x; }

    return x + 1;
}

我知道我可以写上面的内容

fn foo(x: i32) -> i32 {
    if x < 5 { return x; }

    x + 1
}

但我更倾向于写前者,因为这更直观。我确实理解函数返回值应该用作表达式,以便后面有效但是为什么不鼓励前者呢?


6702
2018-01-15 10:58


起源



答案:


它只是

公约不需要有特别好的理由,它们只需要是普遍接受的惯例。碰巧的是,这个确实有一个相对较好的理由 - 因为你没有这个原因所以它更短 return 和 ;。你可能会这么认为 return x + 1; 更直观,但我强烈反对 - 它真的很棒,我感到迫切需要解决它。我说这是一个在开始使用Rust之前从未使用过面向表达式语言的人。在编写Python时, return x + 1 在那个地方看起来正确,而写Rust看起来错了。

现在,碰巧应该编写代码:

fn foo(x: i32) -> i32 {
    if x < 5 {
        x
    } else {
        x + 1
    }
}

这强调了语言的表达方向。


13
2018-01-15 11:10



正如所说的文件 - 或者,我同意你的版本是我如何真实地写这个。拉请求时间...... - Steve Klabnik
每当有一个 else,我宁愿看到 match 用过的;它更好。 - Tshepang
@Tshepang:什么, match x { true => …, false => … }?我在那里肯定不同意你的观点。 - Chris Morgan
实际上,我更喜欢那些职位的回归。 因为 Rust是面向表达式的,跟踪哪些块退出的时间足以让整个函数返回变得有点困难,并且看到一个变得很尴尬 return 当你需要提前返回时,stmt或者两个在中间...表达式方向已经有很多其他的风格优势但是这感觉就像_dis_advantage要遵循,相反......(对于更长的功能,至少) - Noein
“只是。”对成年人来说不是一个好的答案。用户眼中的约定和风格。如果大多数用户发现使用返回直观,那么它是一种很好的风格,无论语言设计者的意见如何。 [评论太久了,请阅读以下链接中的其余部分] gist.github.com/hzhou/432581d0735c035993a1d4bb1863d367 - Hui Zhou


答案:


它只是

公约不需要有特别好的理由,它们只需要是普遍接受的惯例。碰巧的是,这个确实有一个相对较好的理由 - 因为你没有这个原因所以它更短 return 和 ;。你可能会这么认为 return x + 1; 更直观,但我强烈反对 - 它真的很棒,我感到迫切需要解决它。我说这是一个在开始使用Rust之前从未使用过面向表达式语言的人。在编写Python时, return x + 1 在那个地方看起来正确,而写Rust看起来错了。

现在,碰巧应该编写代码:

fn foo(x: i32) -> i32 {
    if x < 5 {
        x
    } else {
        x + 1
    }
}

这强调了语言的表达方向。


13
2018-01-15 11:10



正如所说的文件 - 或者,我同意你的版本是我如何真实地写这个。拉请求时间...... - Steve Klabnik
每当有一个 else,我宁愿看到 match 用过的;它更好。 - Tshepang
@Tshepang:什么, match x { true => …, false => … }?我在那里肯定不同意你的观点。 - Chris Morgan
实际上,我更喜欢那些职位的回归。 因为 Rust是面向表达式的,跟踪哪些块退出的时间足以让整个函数返回变得有点困难,并且看到一个变得很尴尬 return 当你需要提前返回时,stmt或者两个在中间...表达式方向已经有很多其他的风格优势但是这感觉就像_dis_advantage要遵循,相反......(对于更长的功能,至少) - Noein
“只是。”对成年人来说不是一个好的答案。用户眼中的约定和风格。如果大多数用户发现使用返回直观,那么它是一种很好的风格,无论语言设计者的意见如何。 [评论太久了,请阅读以下链接中的其余部分] gist.github.com/hzhou/432581d0735c035993a1d4bb1863d367 - Hui Zhou


复制自 书签交易为什么return语句的语法不明确?


回答来自 @pcwalton

在闭包中显式返回真的很烦人。   例如,   在引入ES6箭头函数之前,这是JavaScript的一个主要难题

myArray.map(function(x) { return x * 2; })

即使没有。也是无偿的冗长 function 关键词。   一旦你用你的语言隐式返回,   为了一致起见,你可能也到处都有它们。   它使代码更简洁的事实只是一个额外的好处。

@mozilla_kmc

Rust是一种面向表达的语言。   块有形式

{
    stmt;
    stmt;
    ...
    stmt;
    expr
}

这些陈述是(基本上)表达式或 let 绑定,   并且尾随表达式是隐含的 () 如果没有指定。   整个块的值是最后一个表达式的值。

这不仅仅适用于功能。你可以写

let foo = if x { y } else { z };

所以 if 也取代了C的 ?: 运营商。   每种块都以相同的方式工作:

let result = unsafe {
    let y = mem::transmute(x);
    y.frob()
};

因此,函数末尾的隐式返回是自然结果   Rust的面向表达式语法。   改进的人体工程学设计只是一个很好的奖励:)

难题: return x 本身就是一种表达 - 它的价值是什么?


0
2017-08-30 16:11





clippy lint给出了以下理由 needless_return 皮棉:

删除返回和分号将使代码更加生锈。

这可能与我们将要得到的客观理由一样好。

就直觉而言;我觉得它是由我们的个人经历塑造的,因此是主观的。虽然Rust本身并不是一种函数式编程语言,但许多使用和开发它的人似乎都在像Haskell这样的函数式编程语言中拥有强大的背景,这些语言完全基于表达式。在Rust的许多方面(例如错误处理)可以强烈地感受到这种影响。所以对于他们(并且说实话,包括我自己)使用表达式而不是语句似乎更优雅。


0
2017-08-30 18:09