在此块的末尾,
entries.map do |key_val|
"[#{key_val.first}] \"#{key_val.last}\""
end.sort.join("\n")
我看到sort
贴在end
. 这很常见吗?它在做什么?我从未见过end
被视为return
. 是这样吗?该map
方法的内部返回一个数组,您可以使用end
?
在此块的末尾,
entries.map do |key_val|
"[#{key_val.first}] \"#{key_val.last}\""
end.sort.join("\n")
我看到sort
贴在end
. 这很常见吗?它在做什么?我从未见过end
被视为return
. 是这样吗?该map
方法的内部返回一个数组,您可以使用end
?
不要被语法所迷惑。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 块传递语法的一个怪癖(当然,如果将方法调用附加到{
...}
块的右大括号也可以)。您只是在调用一个方法(恰好采用您提供的块),然后在第一个方法的返回值上调用第二个方法。
在 ruby 中,一切都返回一个值,包括块。如同:
intermediate_array = entries.map do |key_val|
"[#{key_val.first}] \"#{key_val.last}\""
end
intermediate_array.sort.join("\n")
我更喜欢上面的语法选择,但两者都对解释器完全有效。
我不相信在“结束”上调用方法是常见的做法。我已经学习 ruby 大约 2 个月了,但从未遇到过这种语法。