gpt4 book ai didi

ruby - 将方法添加到 `end`

转载 作者:数据小太阳 更新时间:2023-10-29 08:23:21 25 4
gpt4 key购买 nike

在此 block 的末尾,

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

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

捕获它

最佳答案

不要被语法所迷惑。 do 定义的 block ... end只是传递给 map 的一种特殊类型的参数称呼。它没有放在括号中,或者看起来像是一个论点,但它是一个;方法调用的语法一直运行到 end .所以当你贴一个. 方法 end ,您在 map 的返回值上调用该方法call - 希望是一个数组。

有多种重写方法,以便那些不太熟悉 Ruby 语法古怪之处的人更清楚。例如,按照@AndrewMarshall 的建议,添加一些括号使优先级明确:

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

或者在 block 外创建一个 Proc 并使用 & 将其传递到方法调用括号内,所以链式方法调用在句法上更熟悉(在这个方法中,我还以我认为更简洁的方式重写了 block 本身):

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

关于ruby - 将方法添加到 `end`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19531392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com