2012-06-25 13 views
6

で他の場合こんにちは、私はどうやら私はこのような文をレール疑問符とコロン - ルビー

上のルビーについて質問がありますしている:

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

私が読んだものから、それは、この方法で言われていますparams [:sort]に基づいて列をソートし、paramsがない場合、商品は「名前」でソートされます。しかし、私はこの声明が書かれている方法、特に第2の "?"を理解していません。誰かが私にそれを説明することはできますか?

+2

Google「三元演算子」 –

+0

ありがとう、私はこれを見つけました:http://en.wikipedia.org/wiki/%3F: – qusr

+0

私は、Rubyがすべてをデイジーチェーン接続できるようにする方法がとても好きです。終わりにそれに付けられたメソッドがあるdo-endブロックを見るために変です。 – Ron

答えて

14

これはあなたのコードであり、わかりやすくするために並べ替えてあります。

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 

最初の疑問符は、メソッド名の一部であり、2番目の部分は、(これについてお読みください)です。

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

:ラインのように大まかに翻訳こと

4

? :は三項演算子です。簡単なif-elseの省略形です。

+0

'if'が文であって式ではないC言語や他の言語の回避策に比べて短縮されています。技術的には、PythonとLuaで示されているように、Rubyにそれを持つ理由はありません。 –

10

?: is a ternary operator多くの言語で存在します。

expression ? value_if_true : value_if_false 

はRubyでは、それはこの短いバージョンです::include?

if expression 
    value_if_true 
else 
    value_if_false 
end 
+1

もっと重要なことは、これは短い形式です: 'if式、次にvalue_if_true else value_if_false end'です。 IOW: 'if'式を1行に記述することができます。必要に応じて、恐ろしくわかりにくい条件付き演算子を使用する必要はありません。 –

+0

@JörgWMittag、インライン 'if'-' else'の+1。非常に読みやすいコードを作成し、 'questionのようなものと比較して本当に輝いていますか? ?真:偽」。私は、行が_too_長くなっていない限り、常にそれを使用します。 –

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

最初の疑問符は、メソッド名の一部であり、それは次の構文を持っています。

2番目の疑問符とコロンは、三元オペランドの一部です: (if this is true) ? (do this) : (else, do that).

それはProduct.column_namesparams[:sort]が含まれている場合、それはparams[:sort]を返します、ということを意味します。それ以外の場合は、"name"が返されます。