2

在此块的末尾,

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

我看到sort贴在end. 这很常见吗?它在做什么?我从未见过end被视为return. 是这样吗?该map方法的内部返回一个数组,您可以使用end?

4

3 回答 3

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 块传递语法的一个怪癖(当然,如果将方法调用附加到{...}块的右大括号也可以)。您只是在调用一个方法(恰好采用您提供的块),然后在第一个方法的返回值上调用第二个方法。

于 2013-10-23T01:59:03.367 回答
1

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

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

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

于 2013-10-23T01:54:42.657 回答
0

我不相信在“结束”上调用方法是常见的做法。我已经学习 ruby​​ 大约 2 个月了,但从未遇到过这种语法。

于 2013-10-23T02:52:59.107 回答