2011-08-17 19 views
9

Her zaman Python'un/Ruby'deki diğer bir şey gibi bir şey arıyordum.Python için/Ruby'ye eşdeğer Ruby karşılığı

Bu, döngü yürütülür ve döngüdeki koşul her zaman doğru olmadığı anlamına gelirse, başka bir ifadede değeri döndürür.

yakut, ben böyle yapabilirsiniz:

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

Yani bu iyileştirmek için bir yol var?

Önceden teşekkür ederiz.

cevap

3

Hm, bir üçlü olarak yazabiliriz:

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

Gerçi senin bloğunda daha yararlı bir şeyler yapmak isteyebilirsiniz, each yan etkiler için yürütülen ve orijinal alıcı döndürür beri. Yorumunuza göre

Güncelleme: Sana alabilir yakın

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

Sadece bir satırdan fazla hoşlanmıyorum. Bu daha net değil. İstediğim şey,/else/end gibi bir şey. Belki mümkün değil ama bence soru buna değer. – Cydonia7

+1

Python’un '/ while''üne baktım, @Zabba haklı, üçüncül formu beğenmediysen en yakın muhtemelen bir“ değilse ”. IMHO, her kurguyu bir dilden başka bir dile çevirmeye çalışmak anlamsızdır, ancak YMMV. –

+0

Tüm dili çevirmeye çalışmıyorum ama Python'daki bu yapının gerçekten faydalı olduğunu düşünüyorum. Cevabınız için teşekkür ederiz :) – Cydonia7

24

gibi bir şey yineleyici blok daha fazla kullanım için test edilebilir, hangi içine ne koymak döndüren unutmayın sanırım.

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

Bu iğrenç bir şey. –

0

Daha az ya da çok fonksiyonlu yol: Biz Ruby içinde olduğundan

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

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

, en eğlenelim. Yakut bu gibi kullanılabilecek güçlü case yapısı vardır: Yukarıdaki kod çalışması için Ama

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

, ilk yerli sınıf Symbol değiştirmek zorundayız. Yerel sınıfların değiştirilmesi Ruby uzmanlık alanıdır. Bu sadece bir kez, genellikle bir kütüphanede (mücevher) yapılmalıdır ve size yardım eder. Bu durumda, değişiklik olacaktır:

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

Bu kod kullanılırsa, -:sym söyleyerek :=== yöntemle yamalı yeni boş bir nesne maymun döndürür, tekli eksi bu şekilde Symbol sınıfı (-) operatör aşırı yüklenmesi olayların arkasındaki durum ifadesi.

İlgili konular