【问题标题】:Name Instance Variables Dynamically Ruby动态命名实例变量 Ruby
【发布时间】:2012-05-14 13:05:38
【问题描述】:

我想做的是动态命名变量,例如:

def instance(instance)
    @instance = instance #@instance isn't actually a variable called @instance, rather a variable called @whatever was passed as an argument
end

我该怎么做?

【问题讨论】:

标签: ruby variables dynamic naming


【解决方案1】:

使用instance_variable_set

varname = '@foo'
value = 'bar'
self.instance_variable_set varname, value
@foo   # => "bar"

或者,如果您不希望调用者必须提供“@”:

varname = 'foo'
value = 'bar'
self.instance_variable_set "@#{varname}", value
@foo   # => "bar"

【讨论】:

    【解决方案2】:

    如果我理解正确,您想使用“instance_variable_set”:

    class A
    end
    
    a = A.new
    a.instance_variable_set("@whatever", "foo")
    
    a.instance_variable_get("@whatever") #=> "foo"
    

    【讨论】:

      【解决方案3】:

      你真的不能。

      您可以使用eval,但实际上它不可读。

      使用正确的if 或改用哈希。

      # With Hash:
      values = {}
      a = :foo
      values[a] = "bar"
      values[:foo] # => "bar"
      
      # With if
      calc = "bar"
      if a_is_foo
        foo = calc
      else
        oof = calc
      end
      foo # => "bar"
      

      【讨论】:

      • 怎么样?你到底是什么意思?
      • 他的意思是:var = :a; hash = { var => 'foo' }; hash[var] = 'bar'; hash[var];
      • 我绝不会建议为此使用eval。这是一个设计缺陷,并且 eval 落入坏人手中很危险 ;)
      猜你喜欢
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2014-09-21
      • 1970-01-01
      • 2014-06-10
      • 2011-08-18
      • 2013-03-25
      相关资源
      最近更新 更多