*
splat (या तारांकन) ऑपरेटर है। किसी विधि के संदर्भ में, यह एक चर लंबाई लंबाई सूची निर्दिष्ट करता है। आपके मामले में, func
पर भेजे गए सभी तर्क args
नामक सरणी में डाले जाएंगे। तुम भी तो की तरह एक चर लंबाई तर्क से पहले विशिष्ट तर्क निर्दिष्ट कर सकते हैं:
def func2(arg1, arg2, *other_args)
# ...
end
चलो कहते हैं कि हम इस पद्धति कहते हैं:
func2(1, 2, 3, 4, 5)
आप अब arg1
, arg2
और other_args
func2
भीतर का निरीक्षण किया, तो आप करेंगे निम्नलिखित परिणाम प्राप्त करें:
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]' तकनीक का उपयोग करना है? – shmichael
@shmichael आप अपनी विधि कैसे कॉल कर रहे हैं? यदि आप नहीं चाहते हैं कि आपके तर्क इस तरह की सरणी में डाल दें, तो स्प्लट का उपयोग न करें। –
मैं रेल सम्मेलन का उपयोग कर रहा हूं (उदा। 'My_func arg1, arg2,: html_arg => मान,: html_arg2 => value2')। आदर्श रूप में मैं एक 'args' * हैश * प्राप्त करना चाहता हूं, न कि' args' * सरणी जिसमें हैश * हो सकता है। – shmichael