2010-09-13 5 views
58

? इस विशिष्ट प्रश्न को गुगल करना काफी कठिन था, और मुझे कुछ भी नहीं मिला।जैसे एक मुहावरा का उपयोग करते समय एक समारोह के लिए एक हैश पासिंग (* args) और उसके अर्थ

ऐसा लगता है सभी तर्क वास्तव में args [0] में दिखाई देते हैं तो मुझे लगता है अपने आप को इस तरह के रूप बचाव की मुद्रा में कोड लिखने:

my_var = args[0].delete(:var_name) if args[0] 

लेकिन मैं वहाँ एक बेहतर तरीका है मैं नहीं ले पा रही हूँ यकीन है।

उत्तर

88

*splat (या तारांकन) ऑपरेटर है। किसी विधि के संदर्भ में, यह एक चर लंबाई लंबाई सूची निर्दिष्ट करता है। आपके मामले में, func पर भेजे गए सभी तर्क args नामक सरणी में डाले जाएंगे। तुम भी तो की तरह एक चर लंबाई तर्क से पहले विशिष्ट तर्क निर्दिष्ट कर सकते हैं:

def func2(arg1, arg2, *other_args) 
    # ... 
end 

चलो कहते हैं कि हम इस पद्धति कहते हैं:

func2(1, 2, 3, 4, 5) 

आप अब arg1, arg2 और other_argsfunc2 भीतर का निरीक्षण किया, तो आप करेंगे निम्नलिखित परिणाम प्राप्त करें:

def func2(arg1, arg2, *other_args) 
    p arg1.inspect  # => 1 
    p arg2.inspect  # => 2 
    p other_args.inspect # => [3, 4, 5] 
end 

आपके मामले में, आप एक हैश को तर्क के रूप में पास कर रहे हैं आपके func, इस मामले में, args[0] में हैश होगा, जैसा कि आप देख रहे हैं।

संसाधन:


अद्यतन ओपी की टिप्पणी के आधार

आप एक तर्क के रूप में एक हैश पास करना चाहते हैं, तो आप चाहिए का उपयोग नहीं स्प्लट ऑपरेटर। रुबी आपको ब्रैकेट्स, को छोड़ देता है, जिसमें आपकी विधि कॉल में हैश (एक चेतावनी के साथ, पढ़ना जारी रखें) निर्दिष्ट करते हैं। इसलिए:

my_func arg1, arg2, :html_arg => value, :html_arg2 => value2 

को

my_func(arg1, arg2, {:html_arg => value, :html_arg2 => value2}) 

जब रूबी देखता है अपने तर्क सूची में => ऑपरेटर, तो यह और भी स्पष्ट {...} अंकन के बिना, एक हैश के रूप में तर्क लेने के लिए जानता है (ध्यान दें कि यह बराबर है केवल तभी लागू होता है जब हैश तर्क आखिरी है!)।

आप इस हैश एकत्र करना चाहते हैं, तो आप (हालांकि आप शायद अपने विधि परिभाषा डिफ़ॉल्ट मान के रूप में एक खाली हैश निर्दिष्ट करना चाहते हैं जाएगा) कुछ भी विशेष करने की जरूरत नहीं है:

def my_func(arg1, arg2, html_args = {}) 
    # ... 
end 
+0

तो मुझे पैराम तक पहुंचने पर रक्षात्मक 'अगर तर्क [0]' तकनीक का उपयोग करना है? – shmichael

+0

@shmichael आप अपनी विधि कैसे कॉल कर रहे हैं? यदि आप नहीं चाहते हैं कि आपके तर्क इस तरह की सरणी में डाल दें, तो स्प्लट का उपयोग न करें। –

+0

मैं रेल सम्मेलन का उपयोग कर रहा हूं (उदा। 'My_func arg1, arg2,: html_arg => मान,: html_arg2 => value2')। आदर्श रूप में मैं एक 'args' * हैश * प्राप्त करना चाहता हूं, न कि' args' * सरणी जिसमें हैश * हो सकता है। – shmichael

संबंधित मुद्दे