Ruby的等价于Python的for / else

我一直在寻找类似Python的while / else结构体来改进我的代码。

这意味着循环被执行,如果循环中的条件在任何时候都不是真的,那么它返回else语句中的值。

在ruby中,我可以这样做:

if @items.empty? "Empty" else @items.each do |item| item end end 

那么有没有办法改善这个?

先感谢您。

嗯,你可以把它写成三元:

 @items.empty? ? 'Empty' : @items.each { |item| item } 

您可能希望在块中执行更有用的操作,因为each都是为其副作用执行并返回原始接收器。

根据你的评论更新:我猜你最接近的就像是

 unless @items.empty? @items.each { |item| p item } else 'Empty' end 

请记住,迭代器块会返回您放入的内容,可以对其进行测试以供进一步使用。

 if arr.each do |item| item.some_action(some_arg) end.empty? else_condition_here end 

由于我们是Ruby,让我们玩得开心。 Ruby具有强大的case构造,可以使用如下:

 case items when -:empty? then "Empty" else items.each { |member| # do something with each collection member } end 

但是为了使上面的代码工作,我们必须首先修改本机类Symbol 。 本机类的修改是Ruby专业。 这只需要进行一次,通常在库(gem)中,它可以帮助你。 在这种情况下,修改将是:

 class Symbol def -@ Object.new .define_singleton_method :=== do |o| o.send self end end end 

这段代码以这种方式重载了Symbol类的一元减号( - )运算符,即-:sym返回一个新的空对象猴子,用:===方法修补:===方法,由case语句在幕后使用。

function或多或少的function:

 empty_action = { true => proc{ "Empty"}, false => proc{ |arr| arr.each { |item| item }} } empty_action[@items.empty?][@items]