2011-05-07 49 views
6

访问本地变量我是新来的,但我有以下代码:使用字符串按名称

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"  ) 
+0

的可能的复制_ [使用字符串在Ruby on Rails的运行时间的变量(HTTP:/ /stackoverflow.com/questions/881239/using-a-string-as-a-variable-at-run-time-in-ruby-on-rails)_或_ [使用字符串作为函数名称](http: //stackoverflow.com/questions/877882/using-a-string-as-function-name/878174)_。 – Phrogz 2011-05-07 12:23:06

回答

9

您需要提供您的代码设置得到一个很好的答案(更多详情,或为我找出哪些质疑这是一个重复的:)。 $1引用了什么样的变量?下面是一些猜测:

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

    1. 如果这实际上是对同一个实例的方法,你可以通过调用此方法

      # Same as "@foo.description.downcase" 
      instance_variable_get(:"@#{$1}").description.downcase 
      
    2. 如果这些是局部变量,则不能直接执行此操作,而应更改代码以使用散列:

      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 
      
  • +0

    我的变量是这样的: key = Item.new(:name =>“Key”,:description =>“a key”) Key被$ 1引用 – 2011-05-07 12:48:30

    +0

    @Jake然后你有一个糟糕的(但常见的)设计而你应该将它们存储在上面#3的哈希中。 – Phrogz 2011-05-07 13:12:24

    +0

    你对这个糟糕的设计提出了什么选择?如果解释时间太长,我应该使用Google的快速关键字。 – Seanny123 2013-11-29 02:55:15

    0

    我猜你喜欢匹配 “读门” 与/ ^读(。+)$ /串。所以$ 1 =“门”,它提出了上述错误。如果你想downcase该字符串,只需使用:

    $ 1.downcase

    +0

    这就对了,虽然我想打印存储的描述。例如放$ 1.description.downcase。存储这个变量的是门= Item.new(:name =>“Door”,:description =>“锁着的门”) – 2011-05-07 12:52:42