我试图从本地变量创建一个散列(抛出不存在的变量)。这样的事情:红宝石:从本地变量的新散列
foo = "bar"
baz = "qiz"
["foo", "baz", "nothing"].something_awesome
#=>
{"foo" => "bar", "baz" => "qiz"}
我试过一堆Array和Enumerable的不同组合,但找不到合适的组合。有任何想法吗?
感谢您的帮助!
我试图从本地变量创建一个散列(抛出不存在的变量)。这样的事情:红宝石:从本地变量的新散列
foo = "bar"
baz = "qiz"
["foo", "baz", "nothing"].something_awesome
#=>
{"foo" => "bar", "baz" => "qiz"}
我试过一堆Array和Enumerable的不同组合,但找不到合适的组合。有任何想法吗?
感谢您的帮助!
大厦是一个稍微更地道的版本,燕子例外:
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
应该觉得脏/冒险,你可能想重新考虑你的方法。
尝试使用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>'
某种形式的exception handling结合这一点,你是好去。
示例:晋的回答顶
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"}
这是从当地变量的哈希的一个通用的方法,你甚至都不需要知道的名字:
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'}
这将让你所有当地人,所以如果你想您可以在执行缩减之前过滤列表。
我只是做'{“foo”=> foo,“bar”=> bar}',但这可能是实用主义(并没有一个“完整的上下文”)说话... – 2011-10-07 03:15:40
无法生活foo和baz作为密钥/值的散列?玩变数和游戏真是太不愉快了...... – tokland