为true的未定义方法`each':TrueClass(NoMethodError)

问题描述 投票:1回答:2

我正在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++) { /*...*/ }
ruby for-loop nomethoderror
2个回答
1
投票

首先,eww。从未使用for;这是Ruby的“滋润”。 :)

for item in items ... end由Ruby执行,就像您编写了items.each do |item| ... end。 (实际上这就是Rubyists最初将其编写的方式。)所以等等。

您的行解析为:

for i in (all && (!exists))

[existsfalse时,!existstrue。现在,&&运算符将检查第一个参数是否为真。如果不是,则返回它;否则返回它。如果是,它将返回第二个参数。由于all可能是真实的,因此all && true返回第二个参数-true。

现在记住,您的行实际上是在后台调用要迭代的集合上的each方法。您的“集合”为true-根本不是集合。您无法在true上进行迭代。


0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.