2010-03-17 12 views
18

के रूबी कीवर्ड तर्क, मैं रेलवे की तरह कीवर्ड तर्कों के साथ एक विधि कैसे घोषित कर सकता हूं। कुछ उदाहरणविधि

Person.find(:all, :conditions => "..."). 

उपरोक्त के समान तरीकों को बनाने के लिए मैं प्रतीकों का उपयोग कैसे कर सकता हूं?

मैं रूबी के लिए बहुत नया हूं। अग्रिम में धन्यवाद!

+0

ये हैं कीवर्ड तर्क नहीं। इसके बजाए, आप इस तकनीक को कार्यान्वित करने के तरीके को जानने के लिए इन तर्कों के स्रोत कोड को देख सकते हैं। विचारों के लिए 'ActiveRecord :: Base.find' (http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263) के लिए प्रलेखन पर एक नज़र डालें। – yfeldblum

उत्तर

37

रूबी में वास्तव में कीवर्ड तर्क नहीं हैं। रेल रूबी की एक विशेषता का शोषण कर रही है जो आपको एक हैश के चारों ओर ब्रेसिज़ को छोड़ने देती है। उदाहरण के लिए, find साथ, क्या हम वास्तव में कॉल कर रहे है:

लेकिन अगर हैश विधि के अंतिम तर्क है, तो आप ब्रेसिज़ बाहर छोड़ सकते हैं और यह अभी भी एक हैश रूप में माना जाएगा:

Person.find(:all, :conditions => "...", :offset => 10, :limit => 10) 

आप अपनी खुद की विधियों में इस का उपयोग कर सकते हैं:

def explode(options={}) 
    defaults = { :message => "Kabloooie!", :timer => 10, :count => 1 } 
    options = defaults.merge(options) 

    options[:count].times do 
     sleep options[:timer] 
     puts options[:message] 
    end 
end 

और फिर यह कहते हैं:

explode :message => "Meh.", :count => 3 

या एक तर्क के बिना इसे कहते हैं, सभी मूलभूत मूल्यों में जिसके परिणामस्वरूप इस्तेमाल किया जा रहा:

explode 
+6

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

0

के बाद रूबी गतिशील रूप से लिखा गया है, बस कार्य करें:

def my_method(arg1, arg2) 
    #things 
end 

उदाहरण:

my_method(:test, {:somehash => "yay"}) 

या

my_method :test, :somehash => "yay" 

या

my_method(:test, :somehash => "yay") 
1

तुम सिर्फ एक तरीका है, जहां एक पैरामीटर एक हैश है परिभाषित करने के लिए की जरूरत है। यह वास्तव में बहुत आसान है।

def method(arg1, params) 
    name = params[:name] 
    number = params[:number] 

और फिर फोन इसे पसंद:

method(arg1, :name => 'Eric', :number => 2) 

दो टिप्पणियां:

  1. रूबी में, आप के चारों ओर मानकों में हैश {} जब आप विधि कॉल की जरूरत नहीं है ज्यादातर मामलों में, जब तक कि आपके पास एकाधिक हैंश पास करने की तरह कुछ जटिल नहीं होता है। उस स्थिति में, सुनिश्चित करें कि आप उन पैरामीटर को {}
  2. रूबी गतिशील रूप से टाइप किए गए हैं, इसलिए आपको यह कहने की आवश्यकता नहीं है कि जब आप विधि को परिभाषित करते हैं तो पैरा एक हैश है।
6

मैं समीर तलवार और क्रिस्टोफर राइट द्वारा दिए गए स्वीकृत उत्तर से सहमत हूं। एकमात्र संभावित नकारात्मकता यह है कि यदि आप एक गलत कीवर्ड प्रतीक का प्रयोग तर्क के रूप में करते हैं या किसी विकल्प को देखते समय आपको कोई चेतावनी नहीं मिलती है, तो यह केवल अनदेखा हो जाती है। यदि ऐसा कुछ है जिसके बारे में आप चिंतित हैं, तो मणि hash_keyword_args इसे संबोधित करता है।मुहावरा होगा

def explode(opts={}) 
    opts = opts.keyword_args(:message => "Kabloooie!", :timer => 10, :count => 1) 

    opts.count.times do 
     sleep opts.timer 
     puts opts.message 
    end 
end 

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

explode(:message => "Okay") # works 
explode(:msg => "Oops")  # raises ArgumentError 

मणि भी इस तरह के संकेत मिलता है कि एक कीवर्ड आवश्यक है सक्षम किया जा रहा के रूप में कुछ अन्य सुविधाओं आप या के बारे में परवाह नहीं हो सकता है हो सकता है, प्रदान करता है। मैं थोड़ी देर के लिए खुशी से इसका इस्तेमाल कर रहा हूं।

(अस्वीकरण:। मैं मणि के लेखक हूँ)

0

रूबी 2.0 ने वास्तविक कीवर्ड तर्क प्रस्तुत किए, और रूबी 2.1 ने आवश्यक कीवर्ड तर्क जोड़े।

वहाँ एक अच्छा लेख https://chriszetter.com/blog/2012/11/02/keyword-arguments-in-ruby-2-dot-0/ इस पर पर निर्भर है, मैं वहाँ से उदाहरण उधार लिया है:

रूबी 2.0+:

def exclaim(text, exclamation: '!', number: 7) 
    text + exclamation * number 
end 

exclaim('hello', number: 4) #=> 'hello!!!!' 

# equivalent: 
exclaim('hello', {:number => 4}) #=> 'hello!!!!' 

रूबी 2.1+:

def exclaim(text, exclamation: '!', number:) 
    text + exclamation * number 
end 

exclaim('Yo', number: 5) # => 'Yo!!!!!' 
exclaim('Yo') # raises: ArgumentError: missing keyword: number 
संबंधित मुद्दे