当我在initialize
方法中定义@foo=3
时,我期望像这样访问我的变量。实例变量和attr_accessor
class Object
def initialize(v)
@foo = v
end
Object.new.foo
虽然没有发生。我需要写attr_accessor :foo
。为什么我需要这样做,尽管@
已经为我做到了这一点?
当我在initialize
方法中定义@foo=3
时,我期望像这样访问我的变量。实例变量和attr_accessor
class Object
def initialize(v)
@foo = v
end
Object.new.foo
虽然没有发生。我需要写attr_accessor :foo
。为什么我需要这样做,尽管@
已经为我做到了这一点?
默认情况下,Ruby中的一个实例变量不公开。访问应基于访问者授予。
对于只读attr_reader
对于只写attr_writer
对于读写attr_accessor
这是不是默认
@不会自动为你做的访问。这就是为什么。 attr_accessor
为您的实例变量(“@ -variables”)创建getter和setter。
实例变量是私有的。你需要访问器和变体来访问它们。一个常见的访问/突变对的样子:
def foo
@foo
end
def foo=(value)
@foo=value
end
这将创建一个抽象的,你现在可以为使用:由于这是一个通用的需求,并在大量的样板reults
Classname.new.foo
Classname.new.foo="OOP"
(读:不必要的)代码,ruby提供了一个动态的方法,它为你定义了这两种方法。
attr_accessor :foo
如果你想只访问或赋值函数方法之一,然后用相应的从以下几点:
attr_reader :foo
attr_writer :foo
这将节省大量的复制/粘贴。我希望我很清楚。
实例变量以@字符开头。所有实例变量都是私有的,这意味着您无法读取它们,也无法更改它们的值。那么该怎么办?
class Dog
def initialize(name)
@name = name
end
def name #getter
@name
end
def name=(str) #setter
@name = str
end
end
嗯,这得要键入痛的,因此Ruby提供了一条捷径:
class Dog
attr_accessor :name
def initialize(name)
@name = name
end
end
所有红宝石属性是“私人”,并且是类的方法外面看不见。您需要访问器方法来读取和写入属性。所以,在你的榜样,你需要
class MyClass
def initialize(v)
@foo = v
end
def foo
@foo
end
def foo=(v)
@foo = v
end
end
然后MyClass.new(4).foo
会的工作,并返回4
。
您也可以使用便利的方法
attr_reader :foo
attr_writer :foo
或
attr_accessor :foo
我想你可能会丢失在代码中的'end'添加存取方法。 –