说我有这个:
class Post
def initialize()
vote_total = 0
end
end
显然,这不会设置实例变量,并且这样做,在初始化内部需要写入
self.vote_total = 0
我的问题是......初始化方法中的self是什么?
irb(main):022:0> class Post
irb(main):023:1> puts self
irb(main):024:1> def initialize()
irb(main):025:2> puts self
irb(main):026:2> vote_total = 0
irb(main):027:2> puts self
irb(main):028:2> end
irb(main):029:1> end
Post
=> nil
irb(main):030:0> post = Post.new
#<Post:0x007f9448d76f98>
#<Post:0x007f9448d76f98>
=> #<Post:0x007f9448d76f98>
我理解
之间的差异但功能相似性@instance_variables
obj.method_instance_variables
但我不明白在vote_total行中发生了什么。什么是自我,什么是定义了vote_total?
答案 0 :(得分:3)
initialize
是一个实例方法,因此self
引用该类的新实例。当你在任何方法之外执行self
时(在类体中),self引用类本身。)
其他说明:
两者都没有:
vote_total = 0
self.vote_total = 0
设置实例变量&#39;本身&#39;。第一次调用创建局部变量vote_total
,第二次调用执行方法vote_total=
。如果您的班级名列前面有attr_accessor
或attr_reader
,则此方法定义为
def vote_total=(value)
@vote_total = value
end
正在设置变量。如果您没有这些,并且您没有以任何其他方式定义它(方式的数量非常巨大),那么self.vote_total = :foo
将引发undefined method 'vote_total='
异常。