将方法解决到`end`

时间:2013-10-23 01:50:49

标签: ruby

在这个块的末尾,

entries.map do |key_val|
  "[#{key_val.first}] \"#{key_val.last}\""
end.sort.join("\n")

我看到sort加到了end上。这是常见的吗?它在做什么?我从未将end视为return的值。那是怎么回事?方法内的map返回一个数组,您可以使用end

抓取它

3 个答案:

答案 0 :(得分:6)

不要被语法所迷惑。由do ... end定义的块只是传递给map调用的特殊类型的参数。它不在括号中,或者看起来像是一个参数,但它是一个;方法调用的语法一直运行到end。因此,当您在.上粘贴end 方法时,您将在map调用的返回值上调用该方法 - 希望如此一个数组。

有多种方法可以重写,以便那些不熟悉Ruby语法怪异的人更清楚。例如,根据@AndrewMarshall的建议,添加一些括号以使优先级显式化:

(entries.map do |key_val|
  "[#{key_val.first}] \"#{key_val.last}\""
end).sort.join("\n")

或者从块中创建一个Proc并使用&在方法调用括号内传递它,因此链式方法调用在语法上更熟悉(在这一个我也重写了块本身我认为是一种更清洁的风格):

block = proc do |key, val|
  %([#{key}] "#{val}")
end

entries.map(&block).sort.join("\n")

您可以将其与删除链接级别相结合,如AJcodez的答案:

intermediate_array = entries.map(&block)
intermediate_array.sort.join("\n")

完全取消链接:

mapped = entries.map(&block)
sorted = mapped.sort
joined = sorted.join("\n")
return joined

基本上,方法调用语法附加到end的事实只是Ruby的块传递语法的一个怪癖(当然,如果你将方法调用附加到结束括号中,它也会起作用)一个{ ... }块。你只是调用一个方法(恰好采用你提供的块),然后在第一个方法的返回值上调用第二个方法。

答案 1 :(得分:1)

在ruby中,一切都返回一个值,包括块。与:相同:

intermediate_array = entries.map do |key_val|
  "[#{key_val.first}] \"#{key_val.last}\""
end
intermediate_array.sort.join("\n")

我更喜欢上面的语法选择,但两者对于解释器都是完全有效的。

答案 2 :(得分:0)

我不相信在'结束'上调用方法是常见做法。我现在已经学习了大约2个月的ruby,并且没有遇到过这种语法。