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名称的其他方法。
如何打印姓名?
答案 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"