什么是自我'在initialize()里面?

时间:2014-04-14 20:32:40

标签: ruby

说我有这个:

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?

1 个答案:

答案 0 :(得分:3)

initialize是一个实例方法,因此self引用该类的新实例。当你在任何方法之外执行self时(在类体中),self引用类本身。)

其他说明:

两者都没有:

vote_total = 0
self.vote_total = 0

设置实例变量&#39;本身&#39;。第一次调用创建局部变量vote_total,第二次调用执行方法vote_total=。如果您的班级名列前面有attr_accessorattr_reader,则此方法定义为

def vote_total=(value)
  @vote_total = value
end

正在设置变量。如果您没有这些,并且您没有以任何其他方式定义它(方式的数量非常巨大),那么self.vote_total = :foo将引发undefined method 'vote_total='异常。