考虑以下 Ruby 方法:
def increment(value)
return if value >= 999
value + 1
end
Run Code Online (Sandbox Code Playgroud)
如果执行该语句,该方法会向调用者返回什么值return?
从我自己运行这段代码来看,似乎nil返回了。但是否总是保证return没有指定参数的 a 隐式返回nil?这种行为是否记录在某处?该行为是否依赖于 Ruby 语言版本?
我检查了从https://www.ruby-lang.org/en/documentation/链接到的多个网站,包括http://www.ruby-doc.org/docs/ProgrammingRuby/,但没有找到明确的答案。
return是一个Ruby 关键字。从文档中:
\n\nreturn退出方法。参见方法。如果在顶级范围内满足,则立即停止当前文件的解释。
\n
从方法文档的返回值部分:
\n\n\n默认情况下,方法返回在方法主体中计算的最后一个表达式。... return 关键字可用于明确方法返回值。
\n
来自David Flanagan 和 Yukihiro Matsumoto(Ruby 编程语言的创建者)的《Ruby 编程语言》,第5.5.1 章返回:
\n\n\n\n
return可以选择后跟一个表达式或以逗号分隔的表达式列表。如果没有表达式,则该方法的返回值为nil。如果有一个表达式,则该表达式的值将成为该方法的返回值。如果关键字后面有多个表达式return,则该方法的返回值是一个包含这些表达式的值的数组。
最后一段可以被认为是规范的答案,尽管我相信ISO/IEC 30170中可能有关于此的附加信息。
\n为了阐明if示例中解释器如何评估 using as 修饰符,我将再次引用The Ruby Programming Language 的第5.1.2 章 if As a Modifier:
\n\nWhen
\nif以正常语句形式使用,Ruby\xe2\x80\x99s 语法要求它以关键字终止end。对于简单的单行条件来说,这有点尴尬。这只是一个解析问题,解决方案是使用if关键字本身作为分隔符,将要执行的代码与条件表达式分开。而不是写:\n
if expression then code end我们可以简单地写:
\n\n
code if expression当以这种形式使用时,
\nif称为语句(或表达式)修饰符。如果您\xe2\x80\x99 是 Perl 程序员,您可能会习惯这种语法。如果没有,请注意要执行的代码在前,表达式在后。例如:\n
puts message if message # Output message, if it is defined这种语法更强调要执行的代码,而不那么强调执行代码的条件。当条件很简单或条件几乎总是为真时,使用此语法可以使代码更具可读性。
\n即使条件是最后写入的,它也会首先被评估。如果它的计算结果不是
\nfalseornil,则对代码进行计算,并将其值用作修改后的表达式的返回值。否则,代码不执行,修改后的表达式的返回值为nil。显然,此语法不允许任何类型的else子句。