7

我见过这样的代码:

def some_method
  # ...
end.another_method

零件有什么end.another_method作用?

4

2 回答 2

11

我相信您的示例是错误的,因为您在这里所做的是定义一个方法并在方法定义的结果(不是方法调用)上调用一个方法,这总是(通常?)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

这也是方法链的一个例子。

于 2013-04-19T18:04:28.087 回答
8

在 Ruby 中,.消息发送操作符。(在其他语言中,它会被称为方法调用运算符。)所以,当你说

foo.bar

它的意思是“评估foo并将消息发送bar到评估的结果foo”。

在这种特殊情况下,您将消息发送another_method到评估结果

def some_method; end

Ruby 语言规范说方法定义表达式的值是未定义的,应该被忽略;并且在大多数 Ruby 实现中,方法定义表达式只是简单地计算为nil,这并不是非常有用。

但是,在某些实现中,方法定义表达式的计算结果确实nil. 例如,在 Rubinius 上,它们对CompiledMethod正在定义的方法的对象求值。并且CompiledMethod具有丰富的 API,因此向CompiledMethod对象发送消息绝对是有意义的。

也有人建议方法定义表达式应该返回一个Symbol对应于被定义的方法的名称或一个Method对象。

简单地说:在这种特殊情况下,点的含义与它在 Ruby 中的含义完全相同:发送消息、调用方法、调用成员函数,无论您想调用什么。

于 2013-04-19T18:18:32.223 回答