继承中类方法的self vs class name

时间:2014-10-18 11:28:24

标签: ruby inheritance class-method

在此代码中:

class Dog
  def self.bark
    print "woof"
  end
end

class Little_dog < Dog
end

Little_dog.bark

该方法继承自引用self的通用类。但是下一段代码:

class Dog
  def Dog.bark
    print "woof"
  end
end

class Little_dog < Dog
end

Little_dog.bark

也有效。我期待它给我一个错误,但它没有。

self如何引用类继承下的类方法?当我仅将little_dog类定义为bark的类方法时,为什么Dog类在第二个示例中有类方法{{1}}?

2 个答案:

答案 0 :(得分:3)

self广泛用于Ruby Metaprogramming

来自Metaprogramming Ruby本书:

  

每一行Ruby代码都在一个对象中执行 - 即所谓的   当前对象。当前对象也称为self,因为   您可以使用self关键字访问它。

     

在给定时间只有一个对象可以扮演自我的角色,但没有   对象长期以来一直扮演着这个角色。特别是,当你打电话给   方法,接收器变成自己。从那一刻起,所有实例   变量是self的实例变量,所有方法都被调用   没有明确的接收者就被称为自我。一旦你的代码   显式调用某个其他对象的方法,即其他对象   变得自我。

所以,在代码中:

class Dog
  # self represents the class object i.e: Dog. Which is an instance of Class.
  # `bark` will be treated as class method
  def self.bark 
    print "woof"
  end
end

也可以写成:

class Dog
  # Dog is an instance of Class.
  # `bark` will be treated as class method
  def Dog.bark 
    print "woof"
  end
end

继承允许子类使用其父类的功能。这就是为什么您可以在bark类中访问Little_dog方法的原因,因为它是继承的Dog类:

class Little_dog < Dog
  # has `bark` as a class method because of Dog
end

Ruby style guide tip:在Ruby中,它被认为是使用CamelCase约定来命名类和模块的最佳实践。

答案 1 :(得分:1)

当你定义类方法时,如果使用

,实际上并不重要
Dog.bark

self.bark

两种方法都定义了将由子类继承的类方法。

唯一不同之处在于,当您将类Dog的名称更改为其他内容时,例如BigDog - 当您使用Dog.bark时,显然需要将其更改为BigDog.bark

使用self方法定义时,self.bark仍可使用。