2012-06-25 15 views
6

Witam mam pytanie o Ruby on Railsznak zapytania i okrężnicy - jeśli jeszcze w Ruby

Widocznie mam oświadczenie takiego:

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

Z tego co czytałem, to powiedział, że ta metoda sortuj kolumnę na podstawie params [: sort] i jeśli nie ma żadnych parametrów, produkty będą sortowane według "name". Jednak nie rozumiem sposobu, w jaki to stwierdzenie jest napisane, zwłaszcza drugiego "?". Czy ktoś może mi to wytłumaczyć?

+2

Google "potrójny operator" –

+0

Dziękuję, znalazłem to: http://en.wikipedia.org/wiki/%3F: – qusr

+0

Muszę powiedzieć, bardzo podoba mi się, jak Ruby pozwala mi łączyć wszystko, chociaż wygląda dziwnie, widząc blok do-do-końca, w którym koniec ma dołączoną metodę. – Ron

Odpowiedz

14

To jest Twój kod, uporządkowany w celu łatwiejszego zrozumienia.

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 

Pierwszy znak zapytania jest częścią nazwy metody, drugi - część operatora trójskładnikowego (o czym należy przeczytać).

4

Linia ta przekłada się mniej więcej tak:

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

The? : jest operatorem trójskładnikowym; stenografia krótka, jeśli nie.

+0

To jest mniej skrótowe niż obejście dla C i innych języków, w których 'if' jest wyrażeniem, a nie wyrażeniem. Technicznie nie ma powodu, aby mieć go w Ruby, jak pokazują Python i Lua. –

10

?: is a ternary operator, który jest obecny w wielu językach. To ma następującą składnię:

expression ? value_if_true : value_if_false 

W Ruby, to krótsza wersja to:

if expression 
    value_if_true 
else 
    value_if_false 
end 
+1

Co ważniejsze, jest to krótka wersja tego: 'if expression then value_if_true else value_if_false end'. IOW: możesz napisać wyrażenie 'if' w jednej linii, jeśli chcesz, nie musisz używać straszliwego, nieczytelnego operatora warunkowego. –

+0

@ JörgWMittag, +1 dla wbudowanego 'if' -element'. Sprawia, że ​​kod jest bardzo czytelny i naprawdę świeci w porównaniu do takich rzeczy jak 'pytanie? ? true: false'. Zawsze go używam, chyba że linia się za długo. –

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

Pierwszy znak zapytania jest częścią nazwy metody: include?.

Drugi znak zapytania i jelita grubego są częścią potrójnego argumentu: (if this is true) ? (do this) : (else, do that).

Oznacza to, że jeśli Product.column_names zawiera params[:sort], zwróci params[:sort]. Inaczej powróci "name".

Powiązane problemy