2013-02-25 29 views
10

रूबी 2.0.0 में कीवर्ड तर्कों का उपयोग करने के लिए कीवर्ड तर्कों का उपयोग कब करें, रूबी 2.0.0 कीवर्ड तर्क (केए) का समर्थन करता है और मुझे आश्चर्य है कि शुद्ध रूबी के संदर्भ में इस सुविधा के लाभ/उपयोग-मामले क्या हैं, खासकर जब प्रकाश के प्रकाश में देखा जाता है खोजशब्द मिलान के कारण प्रदर्शन जुर्माना जो हर बार कीवर्ड तर्क के साथ एक विधि कहा जाता है।रुबी

require 'benchmark' 

def foo(a:1,b:2,c:3) 
    [a,b,c] 
end 

def bar(a,b,c) 
    [a,b,c] 
end 

number = 1000000 
Benchmark.bm(4) do |bm| 
    bm.report("foo") { number.times { foo(a:7,b:8,c:9) } } 
    bm.report("bar") { number.times { bar(7,8,9) } } 
end 

#   user  system  total  real 
# foo 2.797000 0.032000 2.829000 ( 2.906362) 
# bar 0.234000 0.000000 0.234000 ( 0.250010) 

उत्तर

1

उदाहरण के लिए

एक समारोह

def welcome_message(message, options={}) 
    default_options = {name: 'hoge'} 
    options = default_options.merge(options) 

    "#{message}、#{options[:name]}" 
end 

लिखा जा सकता है

def welcome_message(message, name: 'hoge') 
    "#{message}、#{name}" 
end 
+0

उत्तर में जोड़ने के लिए, उन्हें उपयोग करें जब आपको अपनी विधि परिभाषा के अंदर चरों के लिए तर्क असाइन करने की आवश्यकता होती है और कस्टम कोड लिखने से बचें। – Kashyap

+0

कृपया हमें धोखा न दें। 'def स्वागत_ संदेश (संदेश, विकल्प = {: नाम => 'होगे'}); "# {संदेश}, # {विकल्प [: नाम]}"; end' 'welcome_message' के लिए एक-लाइनर है। हालांकि, इस दृष्टिकोण का मुख्य नुकसान यह है कि किसी को या तो 'हैश' को थोडा 'key_valid' के साथ विस्तारित करने की आवश्यकता है या उम्मीद है कि पारित कुंजी सही हैं। केए दृष्टिकोण से पता चलता है कि किन कुंजीों की अनुमति है। – mudasobwa

+1

@ मुदासोबावा मुझे लगता है कि आप गलत हैं; आपके फ़ंक्शन के साथ, 'welcome_message ("message", {: age => 22}) परिणाम में' hoge' नहीं दिखाएगा लेकिन 'keyword' का उपयोग करेगा। आप पूरे हैश के लिए एक डिफ़ॉल्ट मान सेट करते हैं, हैश की परिभाषित कुंजी के लिए डिफ़ॉल्ट मान नहीं। – oldergod

3

के बाद से KA माणिक चौड़ा नवाचार कर रहे हैं, मैं दो मुख्य लाभ देखें:

  • परिभाषित तर्क को एक पूर्वनिर्धारित सेट पर सीमित करें, क्योंकि रेल assert_valid_keys के साथ करता है;
  • कोड ब्लॉक के भीतर सुविधा का उपयोग करें।

जोड़ने पर अप:

a = lambda { |name: "Leonardo", age: 67| [name, age] } 
a.call # ⇒ ["Leonardo", 67] 
a.call name: "Michelangelo", age: 88 # ⇒ ["Michelangelo", 88] 
a.call name: "Schwarzenegger", alive: true # ⇒ ArgumentError: unknown keyword: alive 
10

कीवर्ड तर्क में कुछ विशिष्ट लाभ कोई भी पर छुआ है की है।

सबसे पहले आप तर्कों के क्रम के साथ नहीं हैं।

def yo(sup:, whats:"good", dude:"!") 
    # do your thing 
end 

yo(sup: "hey", dude: "?") 

या यहाँ तक कि

yo(dude: "?", sup: "hey") 

यह निकालता है:

def yo(sup, whats="good", dude="!") 
    # do your thing 
end 

yo("hey", nil, "?") 

आप कीवर्ड तर्कों का उपयोग करता है, तो: तो एक मामले में आप एक शून्य तर्क हो सकता है, जहां कभी कभी यह एक बहुत क्लीनर लग रहा है तर्कों के आदेश को याद रखने की आवश्यकता है। हालांकि, नुकसान आपको तर्क के नाम को याद रखना है, लेकिन यह कम या ज्यादा सहज होना चाहिए।

इसके अलावा, जब आपके पास ऐसी कोई विधि हो जो भविष्य में अधिक तर्क लेने की आवश्यकता हो।

def create_person(name:, age:, height:) 
    # make yourself some friends 
end 

क्या आपके सिस्टम अचानक एक व्यक्ति की पसंदीदा कैंडी बार के बारे में जानना चाहता है, या अगर वे अधिक वजन रहे हैं, कैसे आप ऐसा कर सकता है (उनके पसंदीदा कैंडी बार के भी कई उपभोक्ता से)? सरल:

def create_person(name:, age:, height:, favorite_candy:, overweight: true) 
    # make yourself some fat friends 
end 

कीवर्ड तर्कों से पहले वहाँ हमेशा हैश था, लेकिन है कि निकालने और चर आवंटित करने के लिए एक बहुत अधिक बॉयलरप्लेट कोड का नेतृत्व किया। बॉयलरप्लेट कोड == और टाइपिंग == अधिक संभावित टाइपो == कम समय में भयानक रूबी कोड लिखना।

def old_way(name, opts={}) 
    age = opts[:age] 
    height = opts[:height] 
    # all the benefits as before, more arthritis and headaches 
end 

तुम सिर्फ एक विधि है कि एक तर्क लेता है और सबसे अधिक संभावना को बदलने के लिए एक की जरूरत है कभी नहीं होगा सेट कर रहे हैं:

def say_full_name(first_name, last_name) 
    puts "#{first_name} #{last_name}" 
end 

फिर कीवर्ड तर्क से बचा जाना चाहिए, के बाद से वहाँ एक छोटा सा प्रदर्शन है मारो।

3

कीवर्ड तर्कों का उपयोग करने की अक्षमता समस्या अब रूबी-2.2.0 के रूप में एक समस्या प्रतीत नहीं होती है।

Feature #10440 गति समस्या का समाधान हो और ruby-2.2.0 में जारी किया गया था:

सोम नवम्बर 03 03:02:38 2014 कोइची ससाडा

  • पुनर्लेखन विधि/ब्लॉक पैरामीटर फिटिंग तर्क कीवर्ड तर्क अनुकूलन करने के लिए/पैरामीटर और एक splat तर्क। Feature #10440 (विवरण इस टिकट में वर्णित)

आप खुद के लिए यह देख सकते हैं (एक ही कोड का उपयोग कर मूल प्रश्न में दिए गए):

(08:04:%) rvm use ruby-2.0.0-p247 
Using /Users/adam/.rvm/gems/ruby-2.0.0-p247 

(08:04:%) ruby keyword_benchmarks.rb 

     user  system  total  real 
foo 1.390000 0.060000 1.450000 ( 1.451284) 
bar 0.130000 0.000000 0.130000 ( 0.122344) 

(08:04:%) rvm use ruby-2.2.0 
Using /Users/adam/.rvm/gems/ruby-2.2.0 

(08:04:%) ruby keyword_benchmarks.rb 

     user  system  total  real 
foo 0.140000 0.000000 0.140000 ( 0.136194) 
bar 0.110000 0.000000 0.110000 ( 0.116246) 

अभी भी एक बहुत ही नगण्य प्रदर्शन दंड है कीवर्ड तर्क का उपयोग करने के लिए, लेकिन मुझे लगता है कि यह बढ़ी हुई पठनीयता और स्थितित्मक लचीलापन के लाभ के बदले में एक स्वीकार्य व्यापार है।