2016-05-17 5 views
7

में कुंजी के रूप में सिंबल बनाम स्ट्रिंग का उपयोग करते हुए रेल यदि हम एक हैश कुंजी के रूप में स्ट्रिंग का उपयोग करते हैं, तो रूबी को स्ट्रिंग का मूल्यांकन करने और इसकी सामग्री को देखने की आवश्यकता होती है (और उस पर एक हैश फ़ंक्शन की गणना करें) और इसके परिणाम के साथ तुलना करें (हैश) चाबियों के मान जो पहले से ही हैश में संग्रहीत हैं।पैरा बनाम हैश

यदि हम हैश कुंजी के रूप में प्रतीक का उपयोग करते हैं, तो यह निहित है कि यह अपरिवर्तनीय है, इसलिए रूबी मूल रूप से केवल (हैश) ऑब्जेक्ट-आईडी की तुलना (ऑब्जेड) ऑब्जेक्ट-आईडी के विरुद्ध तुलना कर सकती है, पहले ही हैश में संग्रहीत हैं। (काफी तेज)।

लेकिन बात रेल params जो HashWithIndifferentAccess का उदाहरण है में है, अगर हम params[:some_key] बारे में यह 'some_key' को :some_key धर्मान्तरित और फिर इसे पैरामीटर हैश में कुंजी देखने के लिए कोशिश करता है। line 159

def convert_key(key) 
    key.kind_of?(Symbol) ? key.to_s : key 
    end 

इसलिए यदि देखने हैश में कुंजी के रूप में स्ट्रिंग के साथ धीमी है, क्यों करता है HashWithIndifferentAccess स्ट्रिंग के लिए प्रतीक कुंजी को बदल देता है।

उत्तर

3

कारण सुरक्षा के लिए उपयोग किया जाता था। यह अब रूबी 2.2 या बाद में प्रासंगिक नहीं है।

रूबी 2.2 से पहले प्रतीकों कचरा एकत्र नहीं थे। इसका मतलब यह है कि एक बार एक प्रतीक एक शाब्दिक (:my_symbol) या #to_sym के माध्यम से बनाया गया था यह हमेशा के लिए के आसपास होगा।

यदि रेल स्ट्रिंग के बजाए प्रतीकों का उपयोग करते हैं तो यह अनुरोध में पैरा के नामों के अनुरूप प्रतीकों का निर्माण करेगा। एक हमलावर param1, param2 नामक पैरा के साथ अनुरोध भेज सकता है ... और ऐप को हजारों प्रतीकों को आवंटित करके सर्वर सर्वर निकास निकास कर सकता है।

यह अब रूबी 2.2 में मामला है या बाद में

+0

ठीक है अब समझ में आ गया है, इस के लिए धन्यवाद !! –

0

:symbol.to_s हमेशा एक नया उदाहरण स्ट्रिंग बनाएगा, जबकि "string".to_sym हमेशा एक ही प्रतीक उत्पन्न करेगा।

p "string".to_sym.object_id 
#=> 272028 
p "string".to_sym.object_id 
#=> 272028 

p :symbol.to_sym.to_s.object_id 
#=>70127441809260 
p :symbol.to_sym.to_s.object_id 
#=>70127441809160 

इसलिए, यह उस वर्ग की दुकान के डिजाइनर, पहुँच के दौरान तार के अनावश्यक निर्माण से बचने के लिए तारों के रूप में चाबियाँ खासकर अगर एक hash.keys विधि (यह तारों के रूप में कुंजी देता है) का उपयोग कर रहा है लगता है।

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