在此代码中:
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}}?
答案 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
仍可使用。