【问题标题】:Ruby: new hash from local variablesRuby:来自局部变量的新哈希
【发布时间】:2011-10-08 00:21:56
【问题描述】:

我正在尝试从局部变量创建一个哈希(丢弃不存在的变量)。像这样的:

foo = "bar"
baz = "qiz"

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

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

我尝试了 Array 和 Enumerable 的多种不同组合,但找不到合适的组合。有什么想法吗?

感谢您的帮助!

【问题讨论】:

  • 我只会做{"foo" => foo, "bar" => bar},但这可能是实用主义(并且没有“完整的上下文”)在说话......
  • 不能将 foo 和 baz 作为哈希中的键/值吗?玩弄变量和 eval 实在是太不愉快了……

标签: ruby


【解决方案1】:

在 Jin 的回答之上构建了一个稍微惯用的版本,可以吞下异常:

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】:

    这是一种从局部变量中获取哈希的通用方法,您甚至不需要知道名称:

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

    这会让你所有本地人,所以如果你愿意,你可以在减少之前过滤列表。

    【讨论】:

      【解决方案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>'
      

      将它与某种形式的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"}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-11
        • 2013-04-18
        • 2022-01-12
        • 2013-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多