जबकि each
किसी दिए गए पंक्ति के मानों को 2 डी सरणी में परिवर्तित नहीं करता है (विपरीत map
):
test_array = [[0,0],[0,0],[0,0]]
test_array[0].each {|e| e = 1}
test_array # => [[0, 0], [0, 0], [0, 0]]
test_array[0].map! {|e| e = 1}
test_array # => [[1, 1], [0, 0], [0, 0]]
each
किसी दिए गए कॉलम के मानों को बदलता है (एक तरफ से अलग map
):
test_array = [[0,0],[0,0],[0,0]]
test_array.each {|row| row[0] = 2}
test_array # => [[2, 0], [2, 0], [2, 0]]
test_array.map! {|row| row[0] = 2}
test_array # => [2, 2, 2]
क्या कोई समझा सकता है कि क्या हो रहा है?
उत्तर:
जवाब के लिए 3 № 1ऐसा इसलिए है क्योंकि रूबी में, पैरामीटर "ऑब्जेक्ट रेफरेंस द्वारा पास किए जाते हैं"।
नीचे दिए गए मामले में,
test_array.each {|row| row[0] = 2}
row
अंदर एक सरणी को संदर्भित करता है test_array
, और इसकी सामग्री को संशोधित करने में प्रतिबिंबित होगा test_array
। यह उप-सरणी में मौजूद है test_array
.
नीचे दिए गए मामले में,
test_array[0].each {|e| e = 1}
e
में एक पूर्णांक को संदर्भित करता है array[0]
, और यह एक अलग पूर्णांक को इंगित करने से मूल मान को प्रभावित नहीं करेगा क्योंकि हम इसमें मौजूद पूर्णांक मानों को म्यूट नहीं कर रहे हैं array[0]
.
यहां अधिक जानकारी: रूबी संदर्भ या मूल्य से गुजरती है?
आपकी क्वेरी के बारे में map
कृपया ध्यान दें कि आप इसका उपयोग कर रहे हैं map!
, जो ऑब्जेक्ट को म्यूटेट करेगा जिस पर विधि कहा जाता है, जबकि map
मूल्य देता है।
map! {|item| block } → ary
प्रत्येक तत्व के लिए दिए गए ब्लॉक को एक बार आमंत्रित करता है
self
, ब्लॉक द्वारा लौटाए गए मान के साथ तत्व को बदलना।
का आउटपुट map
के रूप में वापस किया गया है:
test_array.map {|row| row[0] = 2}
test_array # => [[2, 0], [2, 0], [2, 0]]
test_array
के उत्पादन के साथ बदल दिया गया है map
:
test_array.map! {|row| row[0] = 2}
test_array # => [2, 2, 2]