如何打印ruby对象的实例变量

时间:2014-12-10 04:00:33

标签: ruby class object instance-variables

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语句时,我都会收到名称不是方法的错误。

我不知道打印p1名称的其他方法。

如何打印姓名?

2 个答案:

答案 0 :(得分: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 :(得分:3)

在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"