近日,一种看似简单却颠覆传统编程习惯的特性——“返回最后一个表达式的值”(Returning the value of the last expression calculated)在多个新兴编程语言及主流语言的更新中悄然走红,引发国内外开发者社区的广泛讨论。这一特性并非全新概念,但在近期随着函数式编程思想的普及和开发者对代码简洁性的极致追求,正从“小众偏好”走向“主流选择”。
什么是“返回最后一个表达式的值”?
传统的命令式编程语言(如C、Java、Python)要求开发者使用显式的 return 语句来指定函数或代码块的返回值。例如在Python中,必须写 return x + y 才能告知解释器输出结果。而“返回最后一个表达式的值”则意味着:在函数、lambda表达式或代码块中,无需显式书写返回关键字,系统自动将最后一条计算出的表达式的值作为返回值。
这一特性已被广泛实践于Ruby、Julia、Kotlin(部分场景)、Rust(表达式末尾)以及新兴语言如Gleam、Zig等。以Ruby为例,以下代码:
def add(a, b)
a + b
end
无需 return,函数自动返回 a + b 的结果。而在Scala中,几乎所有语句都是表达式,最后一行即结果。
背景:从“语句”到“表达式”的范式迁移
北京某互联网公司资深技术总监李铭向本刊记者表示:“这不仅是语法糖的增减,更是编程范式从‘指令式’向‘表达式导向’转变的缩影。”传统编程中,代码被拆解为“产生副作用的语句”和“返回值的表达式”;而采纳“最后一个表达式”的语言倾向于让一切代码都成为表达式,即每行代码既有计算过程,也有计算结果。
这一设计哲学最早可追溯到Lisp和ML系列语言,近年来随着Rust、Elixir等语言的兴起,逐渐被更广泛的开发者群体接纳。Rust语言中,函数最后的表达式(不带分号)即为返回值,而带分号的行则被视为语句,返回 ()(单元类型)。这种明确的语法区分,既保留了命令式编程的灵活性,又为函数式风格提供了天然支持。
优势:简洁性与可读性的双重提升
记者采访了多位一线开发者,多数人认为该特性最大优势在于减少样板代码,提升代码可读性。在上海工作的高级全栈工程师王芳举例:“在编写数据处理管道时,大量的小函数如果都要写 return,会让逻辑被噪音淹没。隐式返回使得代码更像数学公式,意图一目了然。”
此外,该特性在条件分支和模式匹配中表现尤为突出。例如在Kotlin中:
val result = when (x) {
1 -> "one"
2 -> "two"
else -> "other"
}
无需 return,when表达式直接赋值给result。这种写法降低了控制流引入的错误风险,尤其适合需要频繁返回不同值的场景。
争议:隐式返回是否“过于隐蔽”?
然而,任何新特性都伴随着争议。部分习惯于显式 return 的开发者认为,隐式返回降低了代码的可追踪性,尤其在长函数中,“最后一个表达式”究竟是哪一行可能变得模糊。在美国旧金山某科技公司工作的华人工程师张伟表示:“调试时,我需要更仔细地确认函数末尾是否有意漏掉了分号,或者是否误写了某个副作用语句。”
此外,混合使用显式和隐式返回可能导致意外行为。例如在JavaScript的箭头函数中,() => { return 1; } 与 () => 1 行为一致,但若在花括号内忘记写 return 则返回 undefined。这种细微差别常常成为新手陷阱。
行业趋势:主流语言逐步引入“表达式化”特性
尽管存在争议,“返回最后一个表达式”的影响力仍在持续扩大。Python 3.8引入的“海象运算符”(:=)使得赋值表达式成为可能,间接鼓励了表达式化编程。Java 14正式发布的 switch 表达式也支持了直接返回值,无需break。而Google主导的Go语言虽然长期拒绝隐式返回,但在2024年发布的Go 1.23中,社区已多次提出相关提案。
业内人士预测,随着AI辅助编码工具的普及,自动补全和代码审查系统会逐渐适应并帮助开发者避免隐式返回可能带来的错误,从而推动该特性成为未来编程语言的主流设计之一。
结语:一切为了更接近“思考”的语言
“编程语言本质上是人类思维到机器指令的桥梁。”前甲骨文架构师、现独立开发者陈锋总结道,“‘返回最后一个表达式的值’试图让代码更像人脑中自然而然的‘先计算,后给出结果’的流程。它也许不是银弹,但至少提供了一种更优雅的抽象。”
无论您是否选择使用这一特性,不妨在下一个个人项目中尝试开启“隐式返回”——或许您会重新发现编程语言设计中的那份纯粹之美。
(本文首发于《科技前沿资讯》2025年4月,记者 张敏)