ruby 如何从yield statememt中的跳到循环的末尾

0md85ypi  于 2023-06-05  发布在  Ruby
关注(0)|答案(2)|浏览(178)

所以我有一个递归调用,看起来像这样:

def foo list, &block
   list.each do |a|
      newlist = a.bar
      yield a
      foo newlist, &block
   end
end

我试图传递到代码块中,如果a == 0,则不会重复。

foo list do |a|
   next if a == 0
end

但是,这似乎不起作用。所以我尝试传入一个额外的布尔值到块中,但它显然是布尔值的副本,而不是别名(我以为ruby中的原始类型也有别名,因为所有东西都是对象)。
所以这个也不行:

def foo list, &block
   list.each do |a|
      newlist = a.bar
      continue = true
      yield a, continue
      foo newlist, &block if continue
   end
end

foo list do |a, c|
   c = false if a == 0
end

有没有什么方法可以完成我在这里尝试的事情?

zxlwwiss

zxlwwiss1#

我相信你可以在块内使用break而不是next。调用中断应该终止调用的块和方法块(在你的例子中是foo)。不知道这是不是你要找的

0yycz8jy

0yycz8jy2#

这可以通过创建一个Bool_Wrapper类来解决,该类只包含一个布尔值,并具有用于该布尔值的attr_accessor。但希望有人知道更好的方法来解决这个问题!

class Boolean_Holder
   def initialize bool
      @bool = bool
   end
   attr_accessor :bool
end

def foo list, &block
   list.each do |a|
      newlist = a.bar
      continue = Boolean_Holder true
      yield a, continue
      foo newlist, &block if continue.bool
   end
end

foo list do |a, c|
   c.bool = false if a == 0
end

相关问题