了解attr_accessor类方法的自我
class Test class < Test puts Test.get_some.inspect => Test nil
在上面我可以找到自己作为测试本身但不返回some_data
作为输出。
但是当我按照以下方式修改时,它返回预期的输出
class Test class < Test puts Test.get_some.inspect => Test some_data
有什么区别?
编辑
现在在第一个例子中,如果我设置为获取some
方法
Test.some = 'new_data' puts Test.some.inspect #=> new_data Test.set_some puts Test.get_some.inspect => new_data
现在它让我更加困惑。
some = :foo
让ruby认为它应该创建一个名为some
的新局部变量。 如果你想调用some=()
,你必须使用一个显式的接收器 – 就像在self.some = :foo
。 我曾经打过赌注…: – /
它是第一个例子中的(本地)变量
在第一个例子中, some
是局部变量。
在第二个中, some
是self
的方法。 为什么? 因为attr_accessor :some
与:
def some= (val) @some = val end def some return @some end
因此,您已经为实例变量@some
创建了getter和setter方法(它是对象Test
的实例变量,因为每个类也是类Class
的对象)。
在第一种方法中
def set_some puts self.inspect some = 'some_data' end
some是一个局部变量..它与@some不同,它是一个实例变量(在本例中是一个类实例变量),所以当方法结束时该值消失。
如果你想调用setter方法或将@some设置为某个东西,那么就这样做
@some = 'some_data'
要么
self.some = 'some_data'
在第二种方法中
def get_some puts self.inspect self.some end
你调用方法一些。 返回实例变量@some ..并且因为此时@some没有值..返回nil ..
示例1没有方法覆盖且没有局部变量
class Foo def initialize @foo = 'foo' end def print_foo print @foo print self.foo print foo end end
@ foo,self.foo和foo将在实例方法中访问实例变量@foo:
Foo.new.print_foo#=> foofoofoo
示例2 ,方法覆盖
class Foo def initialize @foo = 'foo' end def foo return 'bar' end def print_foo print @foo print self.foo print foo end end
@foo将访问实例变量,但self.foo和foo将调用foo覆盖方法:
Foo.new.print_foo#=> foobarbar
示例3包含方法覆盖和局部变量
class Foo def initialize @foo = 'foo' end def foo return 'bar' end def print_foo foo = 'baz' print @foo print self.foo print foo end end
@foo访问实例变量,self.foo访问覆盖方法,foo访问本地变量:
Foo.new.print_foo#=> foobarbaz