रूबी: स्थानीय चर से नया हैश - रूबी

मैं स्थानीय चर से एक हैश बनाने की कोशिश कर रहा हूं (उन वर्रों को फेंक रहा हूं जो मौजूद नहीं हैं)। कुछ इस तरह:

foo = "bar"
baz = "qiz"

["foo", "baz", "nothing"].something_awesome

#=>
{"foo" => "bar", "baz" => "qiz"}

मैंने ऐरे और एनमेरेबल से विभिन्न संयोजनों का एक गुच्छा करने की कोशिश की है, लेकिन सही कॉम्बो नहीं मिल सकता है। कोई विचार?

आपकी सहायताके लिए धन्यवाद!

उत्तर:

जवाब के लिए 3 № 1

जिन के उत्तर के शीर्ष पर बिल्डिंग थोड़ा और बेवकूफ संस्करण है जो अपवादों को निगलता है:

ree-1.8.7-2011.03 :042 > foo, bar = "bar", "quz"
=> ["bar", "quz"]
ree-1.8.7-2011.03 :043 > %w(foo bar nothing).reduce({}) { |acc, item| acc[item] = eval(item) rescue nil; acc }.reject { |k, v| v.nil? }
=> {"foo"=>"bar", "bar"=>"quz"}

आईएमएचओ हालांकि eval गंदा / जोखिम भरा महसूस करना चाहिए और आप सामान्य रूप से अपने दृष्टिकोण पर पुनर्विचार करना चाहेंगे।


जवाब के लिए 3 № 2

स्थानीय चर से हैश प्राप्त करने का यह एक सामान्य तरीका है, आपको नामों को जानने की भी आवश्यकता नहीं है:

foo, bar = "baz", "qux"
local_names = binding.send(:local_variables)
locals = local_names.reduce({}) do |acc, v|
acc[v] = binding.eval(v.to_s) unless v == :_
acc
end
p locals # {:foo => "baz", :bar => "qux"}

यह आपको मिल जाएगा सब स्थानीय, इसलिए यदि आप चाहते हैं कि आप कम करने से पहले सूची फ़िल्टर कर सकें।


जवाब के लिए 2 № 3

उपयोग करने का प्रयास करें eval

ruby-1.9.2-p290 :001 > foo = "bar"
=> "bar"
ruby-1.9.2-p290 :002 > baz = "qiz"
=> "qiz"
ruby-1.9.2-p290 :003 > ["foo", "baz", "nothing"].each { |x| puts eval(x) }
bar
qiz
NameError: undefined local variable or method `nothing" for main:Object
from (irb):3:in `eval"
from (irb):3:in `eval"
from (irb):3:in `block in irb_binding"
from (irb):3:in `each"
from (irb):3
from /Users/jin/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `<main>"

इसे किसी रूप के साथ संयोजित करें उपवाद सम्भालना और आप "जाने के लिए अच्छा है।

उदाहरण:

foo = "bar"
baz = "qiz"

local_vars = Hash.new(0)

["foo", "baz", "nothing"].each do |x|
begin
local_vars[x] = eval(x)
rescue NameError
puts "No local var named: " + x # No local var named: nothing
end
end

puts local_vars # {"foo"=>"bar", "baz"=>"qiz"}

संबंधित सवाल
सबसे लोकप्रिय