2014-12-10 17 views
5
class Packet 
    def initialize(name, age, number, array) 
    @name = name 
    @age = age 
    @number = number 
    @neighbors = array 
    end 
end 

p1 = Packet.new("n1", 5, 2, [1,2,3,4]) 

puts p1.name 

Yukarıdaki kodu kullanıyorum, ancak her defasında, bu deyimi çalıştırdığımda hatanın bir yöntem olmadığını anladım.Bir ruby ​​nesnesinin örnek değişkenleri nasıl yazdırılır

P1 adını yazdırmanın başka bir yolunu bilmiyorum.

Adı nasıl yazdırılır?

+0

Eksperleri sağlamak istemiyorsanız, '(p1.instance_variable_get koyar: @name) '' n1 ''yazdıracaktır. –

+0

Çözüme zaten bir çözüm buldunuz, fakat çözümlere kendiniz nasıl ulaşmış olabilirsiniz: hata mesajını okuyun! Ne diyor? "Name" adında bir yönteminiz olmadığını söylüyor. Ee ne yapıyorsun? 'Name' adlı bir yöntem oluşturursun! Bu yöntemin ne yapmasını istiyorsun? '@ Name' örnek değişkeninin değerini döndürmesini istersiniz. Yani… 'isim ismi; @name sonu '. Bu çözüme, hata mesajının halihazırda ne yaptığınızı (iyi, önerdiğiniz) izleyerek ulaşmış olabilirsiniz. –

+0

@ JörgWMittag Bunu anlıyorum. Bunu gerçekten yaptım ama Ruby'de sık kullanılan bir kısayol olduğunu hatırlıyorum ama Ruby'yi uzun zamandır kullanmadığımdan beri unuttum. Bu yüzden, neden soruyu sordum. – umdcoder

cevap

6

Buradaki sorun, örnek değişkenleriniz varken bunları erişilebilir yapamadığınızdır. attr_reader :variable_name onları okumanıza izin verecek, attr_writer :variable_name bunları yazmanıza izin verecek ve attr_accessor :variable_name her ikisini de yapmanıza izin verecektir. Bunlar, Ruby'nin standart kitaplığına yerleştirilmiş metaprogramlama kısayollarıdır, böylece değişkenleri kendi başınıza okumak veya yazmak için yöntemler yazmak zorunda kalmazsınız. Örnek değişken adı olan bir sembol alırlar.

class Packet 
    attr_reader :name, :age, :number, :array 
    def initialize(name, age, number, array) 
    @name = name 
    @age = age 
    @number = number 
    @neighbors = array 
    end 
end 

p1 = Packet.new("n1", 5, 2, [1,2,3,4]) 

puts p1.name 
+1

Cevaplar için hepinize teşekkür ederiz! – umdcoder

2

Ruby'de, örnek değişkenler ve yöntemler tamamen ayrıdır. Bir nesnede nokta sözdizimini kullanmak yalnızca yöntemini çağırır. @var

  • attr_writer :var değerini dönecektir var adında bir yöntem oluşturur -

    • attr_reader :var: Neyse ki, (aslında bir yöntem haline bir örnek değişkeni dönüm) sınıfları üzerinde özelliklerini tanımlamak yardımcı olacak birkaç yardımcı program yöntemleri vardır - @var
    • attr_accessor :var değerini belirleyecektir var= adlı bir yöntem oluşturur - yukarıdaki yöntemlerden iki oluşturur
    Eğer bir yöntemle erişilebilir olmasını name istiyorsanız

    , basitçe attr_reader :name kullanın: daha sonra

    class Packet 
        attr_reader :name 
    
        # ... 
    end 
    

    ve:

    Packet.new("n1", 5, 2, [1,2,3,4]).name # => "n1" 
    
  • İlgili konular