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

umd*_*der 5 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
Run Code Online (Sandbox Code Playgroud)

我有上面的代码,但每当我执行puts语句时,我得到的错误是name不是方法.

我不知道任何其他方式来打印p1的名称.

如何打印姓名?

Mar*_*rio 7

这里的问题是,虽然您有实例变量,但您还没有使它们可访问.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
Run Code Online (Sandbox Code Playgroud)


Aug*_*ust 5

在 Ruby 中,实例变量和方法是完全分开的。在对象上使用点语法只会调用一个方法。幸运的是,有一些实用方法可以帮助定义类的属性(本质上是将实例变量转换为方法):

  • attr_reader :var- 创建一个名为var,该方法将返回值@var
  • attr_writer :var- 创建一个名为var=,它将设置 的值@var
  • attr_accessor :var- 创建两者上述两种

如果您想name通过某种方法进行访问,只需使用attr_reader :name

class Packet
  attr_reader :name

  # ...
end
Run Code Online (Sandbox Code Playgroud)

进而:

Packet.new("n1", 5, 2, [1,2,3,4]).name # => "n1"
Run Code Online (Sandbox Code Playgroud)