मेरे पास इस तरह की एक सरणी है:
[1,2,3,2,4,5,3,7,8]
मैं उन्हें अन्य तत्वों के लिए मैप करना चाहता हूं 2 => "बी", 3 => "ए"
[1,"b","a","b",4,5,"a",7,8]
इसे करने के लिए कुछ रणनीतियाँ क्या हैं।
उत्तर:
उत्तर № 1 के लिए 7arr = [1,2,3,2,4,5,3,7,8]
h = { 2=>"b", 3=>"a" }
h.default_proc = ->(_,k) { k }
h.values_at(*arr)
#=> [1, "b", "a", "b", 4, 5, "a", 7, 8]
जवाब के लिए 3 № 2
का उपयोग Hash
मानचित्रण और उपयोग के रूप में Array#map
नया सरणी मैप करने के लिए:
mapping = {2 => "b", 3 => "a" }
[1,2,3,2,4,5,3,7,8].map { |x| mapping.fetch(x, x) }
=> [1, "b", "a", "b", 4, 5, "a", 7, 8]
उत्तर № 3 के लिए 1
यहाँ एक और संभव समाधान, के समान है @falsetru का जवाब:
mapping = Hash.new {|_, v| v }.merge(2 => "b", 3 => "a")
[1, 2, 3, 2, 4, 5, 3, 7, 8].map(&mapping.method(:[]))
# => [1, "b", "a", "b", 4, 5, "a", 7, 8]
में फ़ीचर # 11262 - अधिक वस्तुएं बनाएं जैसे "कार्य" रूबी इश्यू ट्रैकर पर, मैंने सुझाव दिया कि Hash
तों को चाबियों से मानों तक के कार्यों की तरह व्यवहार करना चाहिए, यानी उन्हें लागू करना चाहिए call
तथा to_proc
, जो आपको पास करने की अनुमति देगा mapping
सीधे रूप में परिवर्तन समारोह map
:
[1, 2, 3, 2, 4, 5, 3, 7, 8].map(&mapping)
# => [1, "b", "a", "b", 4, 5, "a", 7, 8]
जब तक मेरा सुझाव लागू नहीं हो जाता (जो शायद "कभी नहीं" है, यह देखते हुए कि किसी ने दो महीने में भी इसे नहीं देखा है), तो आपको काम करने के लिए इस बंदर पैच की आवश्यकता है:
module HashAsFunction
refine Hash do
alias_method :call, :[]
def to_proc
method(:call).to_proc
end
end
end
using HashAsFunction