2011-08-17 153 views
9

我一直在尋找類似Python中的while/else結構來改進我的代碼。Python的for Ruby的等價物

這意味着循環被執行,並且如果循環中的條件在任何時候都不成立,則它返回else語句中的值。

在Ruby中,我可以這樣做:

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

那麼,有沒有改善此問題的方法?

預先感謝您。因爲each爲它的副作用執行,並返回原來的接收器

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

您可能需要做一些更有益的在你的塊,雖然,:

回答

3

嗯,你可以把它寫成一個三元。

更新按照您的留言:我想你可以得到最接近的是一樣的東西

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

我不喜歡它只是一條線。這並不清楚。我想要的是類似於while/else/end。也許這是不可能的,但我認爲這個問題是值得的。 – Cydonia7

+1

我現在查了Python的'while/else',@Zabba是對的,如果你不喜歡三元形式,最接近的可能是'unless..else'。恕我直言,嘗試將每種結構從一種語言翻譯成另一種語言是沒有意義的,但YMMV。 –

+0

我並沒有試圖翻譯所有的語言,但我認爲Python中的這個結構非常有用。謝謝你的回答:) – Cydonia7

24

記住,迭代器塊返回你把它付諸表決,這可以進一步使用進行測試。

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

這太可怕了。 –

0

或多或少是功能性的方式:

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

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

由於我們是在Ruby中,讓我們的樂趣。 Ruby有強大case結構,它可以使用像這樣的:

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

但是爲了讓上面的代碼工作中,我們必須修改本機類Symbol第一。本地類的修改是Ruby專業。這隻需要完成一次,通常在圖書館(寶石),它可以幫助你永遠。在這種情況下,修改將是:

class Symbol 
    def [email protected] 
    Object.new 
    .define_singleton_method :=== do |o| o.send self end 
    end 
end 

此代碼重載一元減號以這樣方式Symbol類(-)算子,即說-:sym返回與:===方法修補一個新的空對象猴,所使用案件陳述幕後。