我见过这样的代码:
def some_method
# ...
end.another_method
零件有什么end.another_method
作用?
我相信您的示例是错误的,因为您在这里所做的是定义一个方法并在方法定义的结果(不是方法调用)上调用一个方法,这总是(通常?)nil
。
fmendez 指的是类似的形式,但end
在这种情况下是块的结尾,而不是方法定义。
因此,例如:
array.map do |element|
element * element
end.sum
假设会返回给定数组元素的平方和。
但是,如果您正在执行这样的方法链接,则更常见的是使用括号样式块而不是do..end
,因此上面的示例将显示为:
array.map{ |element|
element * element
}.sum
Ruby 中的块是方法参数,与任何其他方法参数(除了专用语法)不同,因此将点放在后面与将点放在后面没有end
什么不同)
'hello'.concat(' world!').capitalize
这也是方法链的一个例子。
在 Ruby 中,.
是消息发送操作符。(在其他语言中,它会被称为方法调用运算符。)所以,当你说
foo.bar
它的意思是“评估foo
并将消息发送bar
到评估的结果foo
”。
在这种特殊情况下,您将消息发送another_method
到评估结果
def some_method; end
Ruby 语言规范说方法定义表达式的值是未定义的,应该被忽略;并且在大多数 Ruby 实现中,方法定义表达式只是简单地计算为nil
,这并不是非常有用。
但是,在某些实现中,方法定义表达式的计算结果确实比nil
. 例如,在 Rubinius 上,它们对CompiledMethod
正在定义的方法的对象求值。并且CompiledMethod
具有丰富的 API,因此向CompiledMethod
对象发送消息绝对是有意义的。
也有人建议方法定义表达式应该返回一个Symbol
对应于被定义的方法的名称或一个Method
对象。
简单地说:在这种特殊情况下,点的含义与它在 Ruby 中的含义完全相同:发送消息、调用方法、调用成员函数,无论您想调用什么。