了解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是局部变量。

在第二个中, someself的方法。 为什么? 因为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