惯用Ruby - 执行函数,直到它返回nil,将其值收集到列表中

Xuo*_*uor 13 ruby null list return-value while-loop

我从这篇文章中偷走了我的标题:执行一个函数,直到它返回一个nil,将其值收集到一个列表中

那个问题是指Lisp,坦率地说,是我的头脑.但是,我认为他的问题 - 翻译成Ruby - 正是我自己的:

在[Ruby]中创建条件循环的最佳方法是执行函数,直到它返回NIL,此时它将返回的值收集到列表中?

我现在的,笨重的方法是这样的:

def foo
   ret = Array.new
   x = func() # parenthesis for clarity (I'm not a native Ruby coder...)
   until x.nil?
     ret << x
     x = func() 
   end
   ret
end
Run Code Online (Sandbox Code Playgroud)

这段代码片段会做我想要的......但我知道有一种更干净,更具惯用性的Ruby方法......对吗?

Mla*_*vić 10

有趣的是没有人建议Enumerator和它的take_while方法,对我来说它似乎恰到好处:

# example function that sometimes returns nil
def func
  r = rand(5)
  r == 0 ? nil : r
end

# wrap function call into lazy enumerator
enum = Enumerator.new{|y|
  loop {
    y << func()
  }
}

# take from it until we bump into a nil
arr = enum.take_while{|elem|
  !elem.nil?
}

p arr
#=>[3, 3, 2, 4, 1, 1]
Run Code Online (Sandbox Code Playgroud)


Mar*_*her 8

我想这看起来更像Ruby:

def foo
  r = nil; [].tap { |a| a << r until (r = yield).nil? }
end
Run Code Online (Sandbox Code Playgroud)