10 June 2013

Class 定义中的 self

self 这个变量是和环境息息相关的,典型的见人说人话,见鬼说鬼话的家伙。 在Class 定义的过程中,self代表的是class object,而不是具体化的instance。 这个时候self 就像某些洗脑成功的人士,出去说话就说代表某某组织,不是代表个人一样。 因此

def self.xxxx
end

代表的是定义class里面的函数,调用的时候只能通过 Class名称而不能通过instance进行调用。

class_eval

举一反三,他和instance_eval的唯一区别是他干的是抽象的工作, 后者干的是具体活。

Class instance variable

注意这和class variable 之间的区别,具体看例子

class InstanceVariable
  @my_var =1 # class instance variable

  def p_var
    @my_var = 2  # instance variable
    puts @my_var    
  end

  def self.p_var
    puts @my_var   
  end
end

a = InstanceVariable.new
a.p_var #=>2
a.class.p_var #=>1

class variable 就是@@这种变量,两者的区别如下

  • class variable 对子类和普通intance method 可见,但是定义在class 范围内的@是不可见的

  • class variable 的scope容易把你搞昏, 例如

      @@x = 1  
      class B   
        @@x = 2  
      end  
      puts @@x # => 2  

所以nb的rubyist基本上会放弃对@@的使用



blog comments powered by Disqus