2011-05-07 22 views
6

soy nuevo en esto, pero tengo el siguiente código:utilizar una cadena de acceder a una variable local por su nombre

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

me gustaría utilizar $ 1 como una variable que puedo llamar a los métodos de, actualmente el intérprete devuelve un "NoMethodError: undefined method 'description' for "Door":String".

Editar:

Por ejemplo:

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

duplicado Posible de _ [Usando una cadena como una variable en tiempo de ejecución en Ruby on Rails] (http://stackoverflow.com/questions/881239/using-a-string-as-a-variable-at-run-time-in-ruby-on-rails)_ o _ [Uso de una cadena como nombre de función] (http: //stackoverflow.com/questions/877882/using-a-string-as-function-name/878174)_. – Phrogz

Respuesta

9

Es necesario proporcionar más detalles de la configuración de su código para obtener una buena respuesta (o para mí de averiguar qué pregunta se trata de un duplicado de :). ¿A qué tipo de variables hace referencia el $1? Aquí están algunas suposiciones:

  1. Si esto es en realidad un método en la misma instancia, puede invocar este método por:

    # Same as "self.foo" if $1 is "foo" 
    self.send($1).description.downcase 
    
  2. Si estas son las variables de instancia, entonces:

    # Same as "@foo.description.downcase" 
    instance_variable_get(:"@#{$1}").description.downcase 
    
  3. Si estas son variables locales, no puede hacerlo directamente, y debe cambiar su código para usar un Hash:

    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

Mis variables se ven así: clave = Item.new (: name => "Key",: description => "a key") La clave está referenciada por $ 1 –

+0

@Jake Entonces tiene un diseño malo (pero común) y en su lugar deberías almacenarlos en hash por # 3 arriba. – Phrogz

+0

¿Cuál es la alternativa que proponen para este mal diseño? Si es demasiado largo para explicar, una palabra clave rápida que debería usar Google sería útil. – Seanny123

0

supongo que igualó una cadena como "leer puerta" con/^ lectura (. +) $ /. Entonces $ 1 = "Puerta" y levantó el error anterior. Si desea downcase esa cadena, sólo tiene que utilizar:

$ 1.downcase

+0

Eso es correcto, aunque quiero imprimir la descripción almacenada con él. p.ej. pone $ 1.description.downcase. La variable que almacena esto es door = Item.new (: name => "Door",: description => "a locked door") –

Cuestiones relacionadas