我有:
qs = ["all=true", "limit=-1"]
value = ["agent", "service", "token"]
这段代码:
qs.concat value.map do |val|
"#{field}=#{val}"
end
出现以下错误:
`concat': no implicit conversion of Enumerator into Array (TypeError)`
而这段代码:
values = value.map do |val|
"field=#{val}"
end
qs.concat values
没有。
它们有什么区别?
最佳答案
您的问题是由为链式方法调用提供 block 时的不同优先级引起的。在您的情况下,您使用以下代码:
qs.concat value.map do |val|
"#{field}=#{val}"
end
Ruby 假定您的意思如下:
qs.concat(value.map) do |val|
"#{field}=#{val}"
end
也就是说,Ruby 将 block 传递给忽略 block 的第一个方法(即 qs.concat
)。自 Array#map
returns an Enumerator
如果你没有通过一个 block ,你就会得到你看到的错误。
要解决这个问题,可以使用大括号形式传递 block ,即:
qs.concat value.map { |val|
"#{field}=#{val}"
}
在这种形式下, block 总是传递给“last”方法,即你的 map
。
无论如何,如果对运算符的优先级有任何疑问,最好使用显式括号或中间变量来让人类读者和 Ruby 解释器都清楚你的代码应该如何工作.
关于ruby - 没有将 Enumerator 隐式转换为 Array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53100450/