使用字符串按名称访问本地变量

时间:2011-05-07 11:52:31

标签: ruby

我是新手,但我有以下代码:

when /^read (.+)$/
   puts "Reading #{$1}:"
   puts $1.description.downcase

我想使用$ 1作为变量,我可以调用方法,目前解释器返回"NoMethodError: undefined method 'description' for "Door":String"

修改

例如:

door = Item.new( :name => "Door", :description => "a locked door" )
key  = Item.new( :name => "Key",  :description => "a key"         )

2 个答案:

答案 0 :(得分:10)

您需要提供有关代码设置的更多详细信息以获得一个好的答案(或者让我找出哪个问题是重复的:)。 $1引用了哪些变量?以下是一些猜测:

  1. 如果这实际上是同一实例上的方法,则可以通过以下方式调用此方法:

    # Same as "self.foo" if $1 is "foo"
    self.send($1).description.downcase 
    
  2. 如果这些是实例变量,那么:

    # Same as "@foo.description.downcase"
    instance_variable_get(:"@#{$1}").description.downcase
    
  3. 如果这些是局部变量,则无法直接执行,您应该更改代码以使用哈希:

    objs = {
      'foo' => ...,
      'key' => Item.new( :name => "Key", :description => "a key" )
    }
    objs['jim'] = ...
    case some_str
      when /^read (.+)$/
        puts "Reading #{$1}:"
        puts objs[$1].description.downcase
    end
    

答案 1 :(得分:0)

我猜你用“read Door”和/ ^ read(。+)$ /匹配了一个字符串。所以$ 1 =“门”,它引发了上述错误。如果您想 downcase 该字符串,只需使用:

  

$ 1.downcase