2011-05-07 20 views
6

yerel bir değişkeni erişmek için bir dizeyi kullanın tercüman bir "NoMethodError: undefined method 'description' for "Door":String" döndürür.Bu yeniyim ama şu kod var adıyla

Düzenleme: Örneğin

:

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

Olası yinelenen _ [Ruby on çalışma zamanında bir değişken olarak bir dize kullanarak] (http://stackoverflow.com/questions/881239/using-a-string-as-a-variable-at-run-time-in-ruby-on-rails)_ or _ [İşlev Adı Olarak Dize Kullanmak] (http: //stackoverflow.com/questions/877882/using-a-string-as-function-name/878174)_. – Phrogz

cevap

9
Sen (iyi bir cevap almak için kod kurulum daha fazla ayrıntı için gereken

ya da benim için hangi bu yineleniyor sorgulamaya anlamaya :) Ne tür değişkenler $1 tarafından başvuruyor? İşte bazı tahminler vardır: Bu örnek değişkenler ise o zaman,

# Same as "self.foo" if $1 is "foo" 
self.send($1).description.downcase 
  • : Bu aslında aynı örneğinde bir yöntem ise

    1. bunu aşağıdakileri yöntemi çağırabilirsiniz

      # Same as "@foo.description.downcase" 
      instance_variable_get(:"@#{$1}").description.downcase 
      
    2. bu yerel değişkenler, doğrudan bunu yapamaz ve bir Hash kullanmak için kodunuzu değiştirmeniz gerekir:

      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

    Değişkenlerim şunun gibi görünür: key = Öğe.new (: name => "Anahtar",: description => "bir anahtar") Anahtar, $ 1 –

    +0

    @Jake tarafından başvuruyor. Öyleyse, kötü (ancak ortak) bir tasarımınız var. ve bunun yerine onları yukarıdaki # 3 başına bir Hash içinde saklamanız gerekir. – Phrogz

    +0

    Bu kötü tasarıma önerdiğiniz alternatif nedir? Açıklamak için çok uzunsa, hızlı bir anahtar kelime Google’a yardımcı olur. – Seanny123

    0

    /^ read (. +) $/Ile "read Door" gibi bir dizeyle eşleştirildiğini tahmin ediyorum. Yani $ 1 = "Kapı" ve yukarıdaki hatayı kaldırdı. Eğer o dize downcase istiyorsanız, sadece kullanın:

    $ 1.downcase

    ait
    +0

    Bu doğru, onunla birlikte saklanan tanımı basmak istiyorum rağmen. Örneğin. $ 1.description.downcase koyar. Bunu saklayan değişken kapı = Item.new (: name => "Kapı",: description => "kilitli bir kapı") –