我正在阅读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
}
但我更倾向于写前者,因为这更直观。我确实理解函数返回值应该用作表达式,以便后面有效但是为什么不鼓励前者呢?
它只是 是。
公约不需要有特别好的理由,它们只需要是普遍接受的惯例。碰巧的是,这个确实有一个相对较好的理由 - 因为你没有这个原因所以它更短 return
和 ;
。你可能会这么认为 return x + 1;
更直观,但我强烈反对 - 它真的很棒,我感到迫切需要解决它。我说这是一个在开始使用Rust之前从未使用过面向表达式语言的人。在编写Python时, return x + 1
在那个地方看起来正确,而写Rust看起来错了。
现在,碰巧应该编写代码:
fn foo(x: i32) -> i32 {
if x < 5 {
x
} else {
x + 1
}
}
这强调了语言的表达方向。
它只是 是。
公约不需要有特别好的理由,它们只需要是普遍接受的惯例。碰巧的是,这个确实有一个相对较好的理由 - 因为你没有这个原因所以它更短 return
和 ;
。你可能会这么认为 return x + 1;
更直观,但我强烈反对 - 它真的很棒,我感到迫切需要解决它。我说这是一个在开始使用Rust之前从未使用过面向表达式语言的人。在编写Python时, return x + 1
在那个地方看起来正确,而写Rust看起来错了。
现在,碰巧应该编写代码:
fn foo(x: i32) -> i32 {
if x < 5 {
x
} else {
x + 1
}
}
这强调了语言的表达方向。
复制自 书签交易: 为什么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
本身就是一种表达 - 它的价值是什么?
clippy lint给出了以下理由 needless_return
皮棉:
删除返回和分号将使代码更加生锈。
这可能与我们将要得到的客观理由一样好。
就直觉而言;我觉得它是由我们的个人经历塑造的,因此是主观的。虽然Rust本身并不是一种函数式编程语言,但许多使用和开发它的人似乎都在像Haskell这样的函数式编程语言中拥有强大的背景,这些语言完全基于表达式。在Rust的许多方面(例如错误处理)可以强烈地感受到这种影响。所以对于他们(并且说实话,包括我自己)使用表达式而不是语句似乎更优雅。