ruby - 没有将 Enumerator 隐式转换为 Array

标签 ruby syntax operator-precedence

我有:

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/

相关文章:

ruby - []= 方法总是返回一个值,即使我覆盖

ruby - 删除 String 中的多个空格和新行

haskell - 了解 `evaluate` 功能

java - 管道字符在 Java 方法调用中起什么作用?

javascript - 运算符优先级 : ! 并等待

c - 括号内的运算符优先级

regex - 我如何匹配正则表达式中嵌套的 "if"语句? (使用 ruby )

ruby-on-rails - ElasticSearch + Rails多个 `must`无法正常工作

bash - Bash 中不区分大小写的比较

linux - bash 语句末尾的 "-;"是什么意思?