我正在Ruby中编写一个for循环,该循环遍历数组的元素,直到没有更多要读取的元素或满足条件为止。这是我的实现:
# 'all' is an array
exists = false
for i in all && !exists
exists = all[i].has_card
end
正如标题所述,我遇到此运行时错误:
undefined method `each' for true:TrueClass (NoMethodError)
我对Ruby还是相当陌生,但是我想问题是for
循环试图遍历all
和!exists
(即true
)。我该如何以自己想要的方式为它写一个?
编辑:如果可以澄清,这就是我将在C ++中实现的方式:
for (int i=0; i<all.size() && !exists; i++) { /*...*/ }
首先,eww。从未使用for
;这是Ruby的“滋润”。 :)
for item in items ... end
由Ruby执行,就像您编写了items.each do |item| ... end
。 (实际上这就是Rubyists最初将其编写的方式。)所以等等。
您的行解析为:
for i in (all && (!exists))
[exists
为false
时,!exists
为true
。现在,&&
运算符将检查第一个参数是否为真。如果不是,则返回它;否则返回它。如果是,它将返回第二个参数。由于all
可能是真实的,因此all && true
返回第二个参数-true。
现在记住,您的行实际上是在后台调用要迭代的集合上的each
方法。您的“集合”为true
-根本不是集合。您无法在true
上进行迭代。
all && !exists
正在被评估,并在for
循环中用作要迭代的对象。这就是错误消息true的未定义方法'each':TrueClass。
您可以做的是将for包装在检查存在值的条件下,类似于:
if !exists
for i in all
exists
end
end
但是事实是for
循环在Ruby中很少使用。您可以做的另一件事是使用each
迭代all
的元素,并在exists
为假的情况下跳过或中断迭代:
all.each do |i|
break if exists
...
end