Ruby中’self.method_name’和’class << self'之间的区别

我试图将类的实例化限制为只有一个(不使用单例),但我不能。 我尝试使用类变量(@@),但没有运气。 我用Google搜索并发现了这个:

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 notation class << self打开了对象的本征class << self 。 特征类是一个匿名类,用于存储特定于实例的行为。 在类的情况下,特征类有时被称为元类。

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

一个类(如moritz所述)也是Ruby中的一个对象,只要它是一个对象,它也有一个类。 Ruby中类的类称为Class

任何语言中的“类方法”是一种类是接收者的方法 - 即该方法直接在类本身上调用。

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

但是在Class上定义实例方法意味着所有类都可以访问那种不理想的类方法。

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

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

def MyClass.my_method表示法实际上在MyClass的本征my_method上定义了my_method。 如果你使用这种表示法,你可以通过(一段时间)而不实际理解本征类,因为你可以欺骗自己认为它只是Ruby定义'静态方法'的方式并继续认为Ruby的类模型类似于Java。 然而, class << self符号class << self这一class << self不允许这样的解释,你必须接受本征类的现实。

总之,'类方法'实际上是在本征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/

从技术上讲,您要在类的元类上定义一个方法,而不是类本身。 Yehuda Katz在Ruby中对元类进行了很好的解释:http: //yehudakatz.com/2009/11/15/metaprogramming-in-ruby-its-all-about-the-self/

你的结论是对的。 基本上,你必须记住,即使类是ruby中的对象,因此也有实例。 使用类<< self语句,您只是在改变对象的类实例。

主题行与问题的主体不完全匹配。 我将解决主题中表达的问题

它们是同义词。

 def self.foo ... end 

只是简写

 class << self def foo ... end end