2014-12-10 4 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 

У меня есть код выше, но всякий раз, когда я выполняю оператор puts, я получаю ошибку, что имя не является методом.Как распечатать переменные экземпляра объекта ruby ​​

Я не знаю другого способа напечатать имя p1.

Как напечатать имя?

+0

Если не хотите, чтобы обеспечить оценщикам, 'ставит p1.instance_variable_get (: @name) 'будет печатать' "n1" '. –

+0

Вы уже получили ответы на это решение, но вот как вы могли прийти к решению самостоятельно: прочитайте сообщение об ошибке! Что он говорит? В нем говорится, что у вас нет метода под названием 'name'. Ну так что ты делаешь? Вы создаете метод под названием 'name'! Что вы хотите, чтобы этот метод выполнял? Вы хотите, чтобы он возвращал значение переменной экземпляра '@ name'. Итак ... 'def name; @name end'. Вы могли бы прийти к этому решению, просто следуя тому, что сообщение об ошибке уже говорит (ну, подсказывает), что вы должны делать. –

+0

@ JörgWMittag Я это понимаю. Я действительно сделал это, но я помню, что в Ruby есть ярлык, который обычно используется, но я забыл его, так как я не использовал Ruby в течение длительного времени. Поэтому я задал вопрос. – umdcoder

ответ

6

Проблема в том, что, хотя у вас есть переменные экземпляра, вы не сделали их доступными. attr_reader :variable_name позволит вам прочитать их, attr_writer :variable_name позволит вам написать их, и attr_accessor :variable_name позволит вам обоим. Это ярлыки метапрограммирования, встроенные в стандартную библиотеку Ruby, поэтому вам не нужно писать методы для чтения или записи переменных самостоятельно. Они берут символ, который является именем переменной экземпляра.

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

Спасибо всем за ответы! – umdcoder

2

В Ruby переменные экземпляра и методы полностью разделены. Использование точечного синтаксиса для объекта будет только вызовом метода. К счастью, есть несколько методов, утилита, чтобы помочь определить атрибуты классов (по сути превращая переменный экземпляр в метод):

  • attr_reader :var - создает метод с именем var, который будет возвращать значение @var
  • attr_writer :var - создает метод с именем var=, который установит значение @var
  • attr_accessor :var - создает как из описанных выше способов

Если вы хотите name быть доступны через метод, просто использовать attr_reader :name:

class Packet 
    attr_reader :name 

    # ... 
end 

, а затем:

Packet.new("n1", 5, 2, [1,2,3,4]).name # => "n1" 
Смежные вопросы