gpt4 book ai didi

ruby-on-rails - Ruby 中 'self.method_name' 和 'class << self' 的区别

转载 作者:数据小太阳 更新时间:2023-10-29 07:08:37 25 4
gpt4 key购买 nike

我试图将一个类的实例化限制为一个类(不使用单例),但我做不到。我尝试使用类变量 (@@) 但没有成功。我用谷歌搜索并发现了这个:

class A 
@count = 0

class << self
attr_accessor :count
end

def initialize val
@a = val
self.class.count += 1
end
end

a=A.new 42
b=A.new 43

我搜索了 'class << self' 的解释,希望能找到更好的(或者更简单和干净的),但再次,没有运气。最后,经过一些测试后我得出结论,'class << self' 只是一个 block 包装器,您可以在其中定义 class 方法。那么,这是正确的吗?

问候!

最佳答案

class << self符号打开了对象的特征类。特征类是一个匿名类,用于存储特定于实例的行为。在类的情况下,特征类有时称为元类。

Ruby 使用特征类来实现所谓的“类方法”(也称为静态方法)。

类(如莫里茨所述)在 Ruby 中也是对象,就其为对象而言,它也有一个类。 Ruby中一个类的类叫做Class .

任何语言中的“类方法”都是以类为接收者的方法——即直接在类本身上调用该方法。

但是,为了在接收器上调用方法,必须在该接收器的类上定义该方法。在类的情况下,“类方法”可以作为实例方法在 Class 上实现。类。

但是在 Class 上定义一个实例方法将意味着所有类都可以访问该类方法,这并不理想。

进入特征类,如前所述,对象的特征类是一个特殊的类,存储了该对象特有的方法。在类的情况下,特征类是 Class 的子类类并且是该类的直接类。

因此,Ruby 中的“类方法”只是在类的特征类上定义的“实例方法”。

def MyClass.my_method符号实际上定义了 my_method在 MyClass 的特征类上。如果你使用这种表示法,你可以(暂时)在不真正理解特征类的情况下过关,因为你可以欺骗自己认为这只是 Ruby 定义“静态方法”的方式,并继续认为 Ruby 的类模型与 Java 的类模型相似。然而,class << self符号不允许这样的解释,您必须接受特征类的现实。

总而言之,“类方法”实际上是在特征类和class << self 上定义的“实例方法”使您可以访问特征类。

要了解更多信息,请查看这些链接:

http://banisterfiend.wordpress.com/2008/11/25/a-complete-ruby-class-diagram/

http://banisterfiend.wordpress.com/2008/10/25/the-secret-life-of-singletons/

http://www.klankboomklang.com/2007/09/21/the-singleton-class/

关于ruby-on-rails - Ruby 中 'self.method_name' 和 'class << self' 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2025569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com