Ruby的等价于Python的for / else

时间:2011-08-17 09:18:20

标签: ruby

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

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

在红宝石中,我可以这样做:

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

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

提前谢谢。

3 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:3)

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

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

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

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

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

答案 2 :(得分:0)

或多或少的功能方式:

empty_action = { true  => proc{ "Empty"}, 
                 false => proc{ |arr| arr.each { |item| item }} }

empty_action[@items.empty?][@items]