Ruby 未定义的方法'each';对于true:TrueClass(NoMethodError)

Ruby 未定义的方法'each';对于true:TrueClass(NoMethodError),ruby,for-loop,nomethoderror,Ruby,For Loop,Nomethoderror,我正在用Ruby编写一个for循环,循环遍历数组中的元素,直到没有更多的元素可读取或满足条件为止。这是我的实现: #“all”是一个数组 存在=错误 因为我在所有&&!存在 存在=所有[i]。有\U卡 结束 正如标题所说,我遇到了以下运行时错误: undefined method `each' for true:TrueClass (NoMethodError) 我对Ruby相当陌生,但我猜问题在于for循环试图迭代all和!存在,即为真。我怎样才能为我想要的方式工作的人写一本书呢 编辑:如

我正在用Ruby编写一个for循环,循环遍历数组中的元素,直到没有更多的元素可读取或满足条件为止。这是我的实现:

#“all”是一个数组
存在=错误
因为我在所有&&!存在
存在=所有[i]。有\U卡
结束
正如标题所说,我遇到了以下运行时错误:

undefined method `each' for true:TrueClass (NoMethodError)
我对Ruby相当陌生,但我猜问题在于
for
循环试图迭代
all
!存在
,即
为真
。我怎样才能为我想要的方式工作的人写一本书呢

编辑:如果这是一个澄清,我将用C++实现它:


for(inti=0;i首先,eww.
for
从未使用过;它是Ruby的“潮湿”部分。)

用于项目中的项目。。。end
由Ruby执行,就像您编写了
项一样。每个do | item |。。。结束
。(事实上,这是红宝石专家们一开始写的)这是相关的;等等

您的行解析为:

for i in (all && (!exists))
存在时
!存在
是否为
。现在,
&&
操作符将检查第一个参数是否真实;如果不是,则返回;如果是,则返回第二个参数。由于
all
可能是真的,
all&&true
返回第二个参数-true

现在请记住,您的行实际上是在后台对正在迭代的集合调用
each
方法。您的“收藏”是
真的
——根本不是收藏。您不能在
true
上迭代

如果您不想使用
中断
(这有点不合理,您可以引用我的话),可以使用
可枚举
模块中的其他方法。例如:

all.take_while { |item| !item.has_card }.each do |item|
  # ...
end
这比
break
方法稍微慢一点,因为它将构造一个中间数组,其中只包含前N个没有卡的项,稍后它将迭代这些卡,但担心这是一个过早的优化

编辑:不幸的是,塞巴斯蒂安删除了他们的答案,因为他们的答案有正确的习惯用法(我可能会比上面的答案写得更快,尽管这取决于具体情况),所以我在这里重复一下:

all.each do |item|
  break if item.has_card
  # ...
end
没有<代码>用于
(并且等价地,
每个
只会在整个集合上迭代。您无法指定附加条件。您可以使用除每个之外的函数,或者有条件地使用
中断
来执行此操作。没有办法纯粹使用
for
来完成您想要的操作。Ruby
for
几乎与此无关对于,您最好忘记它的存在。