2012-06-25 28 views
6

Merhaba ben raylarsoru işareti ve kolon -

üzerine Yakut hakkında bir sorum var yakut başka Görünüşe göre böyle bir açıklama vardır: Okuduklarım

def sort_column 
    Product.column_names.include?(params[:sort]) ? params[:sort] : "name" 
end 

, bu söylenir itibaren bu yöntem Sütunları parazitlere göre sıralayın [: sort] ve hiçbir param yoksa ürünler "isim" ile sıralanır. Ancak, bu ifadenin nasıl yazıldığını anlamıyorum, özellikle de ikinci "?". Birisi bana bunu açıklayabilir mi ?

+2

Google "Üçlü operatör" –

+0

Teşekkür ederim, şunu buldum: http://en.wikipedia.org/wiki/%3F: – qusr

+0

Şunu söylemeliyim ki, Ruby'nin herşeye rağmen nasıl zincirleme yapmamı istediğini çok seviyorum. Sonunda bir yöntemin bağlı olduğu bir bitiş bloğu görmek garip görünmüyor. – Ron

cevap

14

Bu, daha kolay anlaşılması için yeniden düzenlenmiş kodunuz.

def sort_column 
    cond = Product.column_names.include?(params[:sort]) 
    cond ? params[:sort] : "name" 
    # it's equivalent to this 
    # if cond 
    # params[:sort] 
    # else 
    # 'name' 
    # end 
end 

İlk soru işareti, bir yöntem adının bir parçası olan, ikincisi - (hakkında okumalısınız) üçlü operatör parçası.

4

hat olarak kabaca çevirir O:

if Product.column_names.include?(params[:sort]) 
    params[:sort] 
else 
    "name" 
end 

? : üçlü bir operatördür; Kısa bir if-else için kestirme. Birçok dilde mevcut olan

+0

C ve diğer diller için bir çözümden ziyade bir ifade değil, bir deyimdir. Teknik olarak Python ve Lua'nın gösterdiği gibi Ruby'de buna sahip olmak için bir sebep yok. –

10

?: is a ternary operator.

expression ? value_if_true : value_if_false 

Ruby, bu daha kısa bir versiyonudur: include?:

if expression 
    value_if_true 
else 
    value_if_false 
end 
+1

Daha da önemlisi, bunun kısa bir versiyonudur: eğer ifade daha sonra value_if_true else_de_false end '. IOW: Bir satırda bir 'if'-ifade yazabilirsiniz, eğer isterseniz, korkunç şifreli okunamayan koşullu operatörü kullanmanız gerekmez. –

+0

@ JörgWMittag, +1 satır içi 'if'-'else'. Çok okunabilir kodlar yapar ve soru gibi bir şeyle kıyaslandığında gerçekten parlar. ? doğru: yanlış '. Hat _too_ uzun olmadıkça her zaman kullanırım. –

2
Product.column_names.include?(params[:sort]) ? params[:sort] : "name" 

ilk soru işareti yöntemi adı parçasıdır Şu sözdizimine sahiptir. (if this is true) ? (do this) : (else, do that).

O Product.column_namesparams[:sort] içeriyorsa, bu params[:sort] dönecek, anlamına gelir:

ikinci soru işareti ve kolon

üçlü işlenen bir parçasıdır. Else, "name" dönecektir.

İlgili konular