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]