Используйте строку для доступа к локальной переменной по имени - PullRequest
6 голосов
/ 07 мая 2011

Я новичок в этом, но у меня есть следующий код:

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 ]

10 голосов
/ 07 мая 2011

Вы должны предоставить более подробную информацию о настройке вашего кода, чтобы получить хороший ответ (или чтобы я выяснил, какой вопрос является дубликатом :). На какие переменные ссылается $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
    
0 голосов
/ 07 мая 2011

Полагаю, вы сопоставили строку типа "read Door" с / ^ read (. +) $ /.Таким образом, $ 1 = "Дверь", и это подняло вышеупомянутую ошибку.Если вы хотите вниз этой строки, просто используйте:

$ 1.downcase

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...