end.method在Ruby中做了什么?

Ser*_*ize 7 ruby syntax

我见过这样的代码:

def some_method
  # ...
end.another_method
Run Code Online (Sandbox Code Playgroud)

end.another_method部分做什么?

Mla*_*vić 10

我相信你的例子是错的,因为你在这里做的是定义一个方法并在方法定义(不是方法调用)的结果上调用一个方法,它总是(通常是?)nil.

fmendez指的是一个类似的形式,但它end是块的结尾,而不是那种情况下的方法定义.

所以,例如:

array.map do |element|
  element * element
end.sum
Run Code Online (Sandbox Code Playgroud)

假设,它会返回给定数组元素的平方和.

但是,如果您正在进行这样的方法链接,则更常见的是使用括号样式块而不是do..end,因此上面的示例将为:

array.map{ |element|
  element * element
}.sum
Run Code Online (Sandbox Code Playgroud)

Ruby中的块是方法参数,与任何其他方法参数(除了专用语法)不同,因此将dot后面end的点放在后面的点后面没有什么不同).

'hello'.concat(' world!').capitalize
Run Code Online (Sandbox Code Playgroud)

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


Jör*_*tag 8

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

foo.bar
Run Code Online (Sandbox Code Playgroud)

它的意思是"评估foo并将消息发送bar到评估结果foo".

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

def some_method; end
Run Code Online (Sandbox Code Playgroud)

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

但是,在某些实现中,方法定义表达式的确会评估为更有用的东西nil.例如,在Rubinius上,他们评估CompiledMethod所定义方法的对象.并且CompiledMethod具有丰富的API,因此向CompiledMethod对象发送消息绝对有意义.

还提出方法定义表达式应该返回Symbol对应于被定义的方法的名称或Method对象.

简单地说:这个特殊情况下的点意味着它在Ruby中总是意味着完全相同:发送消息,调用方法,调用成员函数,无论你想要调用它.