gpt4 book ai didi

ruby - ruby创建单例类有哪些场景

转载 作者:太空宇宙 更新时间:2023-11-03 16:26:22 24 4
gpt4 key购买 nike

我是 ruby 新手。我已经理解了 ruby​​ 的单例类概念,但我有一个问题,即 ruby​​ 在什么时候为对象创建单例类。我的意思是当对象定义自己的方法(不在其祖先类或父类(super class)中)或在运行时创建对象时。我很清楚这样一个概念,即当一个类或对象将方法定义为它们自己的方法时,在对象及其类之间插入一个匿名类,称为“单例类”。但是看看这个线程 Difference between class variables and class instance variables?在栏杆回答中,他使用了类似的东西

hello.singleton_class.class_variable_get(:@@class_var)

其中 hello 是类 Hello 的对象,它具有类变量 @@class_var。为什么我们必须在

中使用“singleton_class”
hello.singleton_class.class_variable_get(:@@class_var)

当你在类中定义类变量时,单例类是否也会被插入?

最佳答案

如果您查看 source code of singleton_class你会发现它只是转发给 C 函数 rb_singleton_class(至少它对 MRI 是这样)。如果你dive further进入that您会发现一些 C 代码基本上可以归结为针对异常情况的一组精心设计的测试,然后如果一切顺利,则会创建单例类。

从概念上讲,singleton_class 顾名思义,是一个单例 Class 对象。正如每个表现良好的单例一样,它将在第一次访问时创建。发生这种情况是因为您定义了单例方法还是因为您显式访问 singleton_class 完全取决于您的程序。对于大多数对象,永远不会调用 singleton_class,因此根本不会创建 Class 对象。如果不是这种情况,它就不值得 singleton 机制引起的开销。

我认为您引用的答案的作者只是想说明访问 @@class_var 类变量的不同可能性。由于 class_variable_get 是类 Class 的一个方法,他将需要该类的一个实例,并且由于单例类是从常规父类隐式派生的,他可以使用它。在这个例子中他也可能使用

hello.class.class_variable_get(:@@class_var)

同样的效果。

关于ruby - ruby创建单例类有哪些场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24075241/

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