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的名称.
如何打印姓名?
这里的问题是,虽然您有实例变量,但您还没有使它们可访问.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)
在 Ruby 中,实例变量和方法是完全分开的。在对象上使用点语法只会调用一个方法。幸运的是,有一些实用方法可以帮助定义类的属性(本质上是将实例变量转换为方法):
attr_reader :var- 创建一个名为var,该方法将返回值@varattr_writer :var- 创建一个名为var=,它将设置 的值@varattr_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)