2011-10-07 39 views
2

我试图从本地变量创建一个散列(抛出不存在的变量)。这样的事情:红宝石:从本地变量的新散列

foo = "bar" 
baz = "qiz" 

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

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

我试过一堆Array和Enumerable的不同组合,但找不到合适的组合。有任何想法吗?

感谢您的帮助!

+0

我只是做'{“foo”=> foo,“bar”=> bar}',但这可能是实用主义(并没有一个“完整的上下文”)说话... – 2011-10-07 03:15:40

+0

无法生活foo和baz作为密钥/值的散列?玩变数和游戏真是太不愉快了...... – tokland

回答

3

大厦是一个稍微更地道的版本,燕子例外:

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应该觉得脏/冒险,你可能想重新考虑你的方法。

2

尝试使用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"} 
3

这是从当地变量的哈希的一个通用的方法,你甚至都不需要知道的名字:

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'} 

这将让你所有当地人,所以如果你想您可以在执行缩减之前过滤列表。