2012-06-25 9 views
6

हाय मैं रेलप्रश्न चिह्न और पेट - माणिक में और अगर

पर गहरे लाल रंग का के बारे में एक प्रश्न है जाहिरा तौर पर मैं इस तरह एक बयान है:

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

से मैं क्या पढ़ा है, यह है कि कहा है इस विधि पैराम पर आधारित कॉलम को सॉर्ट करें [: ​​सॉर्ट] और यदि कोई पैराम नहीं है तो उत्पादों को "नाम" द्वारा क्रमबद्ध किया जाएगा। हालांकि, मुझे यह समझ नहीं आया कि इस कथन को किस तरह लिखा गया है, खासकर दूसरा "?"। क्या कोई मुझे यह समझा सकता है ?

+2

Google "टर्नरी ऑपरेटर" –

+0

धन्यवाद, मुझे यह मिला: http://en.wikipedia.org/wiki/%3F: – qusr

+0

मुझे यह कहना होगा, मुझे लगता है कि रूबी मुझे सब कुछ डेज़ी चेन की अनुमति देता है, हालांकि यह एक डू-एंड ब्लॉक देखने के लिए अजीब लग रहा है जहां अंत में एक विधि संलग्न है। – 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 

पहला प्रश्न चिह्न एक विधि नाम का हिस्सा है, दूसरा - टर्नरी ऑपरेटर का हिस्सा (जिसे आपको पढ़ना चाहिए)।

4

पंक्ति के रूप में मोटे तौर पर तब्दील हो कि:

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

? : एक टर्नरी ऑपरेटर है; संक्षेप में थोड़ी देर के लिए शॉर्टेंड।

+0

सी और अन्य भाषाओं के लिए कामकाज की तुलना में यह कम शॉर्टेंड है जहां 'if' एक कथन है और अभिव्यक्ति नहीं है। तकनीकी रूप से रूबी में होने का कोई कारण नहीं है, जैसा कि पाइथन और लुआ द्वारा दिखाया गया है। –

10

?: is a ternary operator जो कई भाषाओं में मौजूद है।

expression ? value_if_true : value_if_false 

रूबी में, यह इस बात का एक छोटा संस्करण है: include?:

if expression 
    value_if_true 
else 
    value_if_false 
end 
+1

अधिक महत्वपूर्ण बात यह है कि यह इसका एक छोटा संस्करण है: 'अगर अभिव्यक्ति तो value_if_true else value_if_false end'। IOW: यदि आप चाहते हैं, तो आप एक पंक्ति पर 'if'-expression लिख सकते हैं, आपको बहुत ही क्रिप्टिक अपठनीय सशर्त ऑपरेटर का उपयोग करने की आवश्यकता नहीं है। –

+0

@ JörgWMittag, इनलाइन 'if'-'else' के लिए +1। बहुत पठनीय कोड के लिए बनाता है, और वास्तव में 'सवाल' जैसी चीजों की तुलना में चमकता है? ? सच: झूठा'। मैं हमेशा इसका उपयोग तब तक करता हूं जब तक कि लाइन _too_ लंबी न हो। –

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

पहले प्रश्न चिह्न विधि नाम का हिस्सा है यह निम्न सिंटैक्स है।

दूसरा प्रश्न चिह्न और पेट के त्रिगुट संकार्य का हिस्सा हैं: (if this is true) ? (do this) : (else, do that).

इसका मतलब है कि, अगर Product.column_namesparams[:sort] सम्मिलित हैं, तो params[:sort] वापस आ जाएगी। अन्यथा, यह "name" वापस आ जाएगा।