在这个块的末尾,
entries.map do |key_val|
"[#{key_val.first}] \"#{key_val.last}\""
end.sort.join("\n")
我看到sort
加到了end
上。这是常见的吗?它在做什么?我从未将end
视为return
的值。那是怎么回事?方法内的map
返回一个数组,您可以使用end
?
答案 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,并且没有遇到过这种语法。