问题标签 [eigenclass]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
44 浏览

ruby - 为什么在 main 中定义一个方法同时在 Object 和 main.singleton_class 中定义它?

当在顶层执行定义时,我正在检查在 Ruby 中定义方法的位置,结果令人惊讶:

它似乎foo同时定义在两个类中!有什么解释吗?

0 投票
2 回答
586 浏览

ruby - 继承在 Ruby 中是如何工作的?

根据 Dave Thomas 在他关于 Ruby 对象模型的演讲中,Ruby中没有“类方法”。方法的接收者是“类对象”还是“实例对象”只有区别。

默认情况下,ancestors方法不显示元类:

但是,我认为真正的应该是这样的:

现在继承。

以下将为 创建一个新的特征类B

  1. 当特征类也包括在内时 和 会是什么样B.ancestors子?B.metaclass.ancestors该方法say_hello存储在一个特征类中,(我假设B.class继承自)但那在哪里?

  2. 由于有两个祖先链(B.ancestorsB.class.ancestorsB.metaclass.ancestors),继承实际上是如何发生的?

0 投票
1 回答
1164 浏览

ruby - Ruby - 有没有办法获取特征类的实例?

我正在寻找一种获取特征类实例的方法,因为每个特征类只有一个实例。

我可以通过 ObjectSpace 来测试每个特征类,但我想它很昂贵。

奇怪的是,我必须得到每个对象的特征类来测试匹配,因为is_a?这还不够:

我希望有一个Class#instanceClass#instances方法来获取一个类(或特征类)的实例。

最直接的方法是从 eigenclass' 中提取实例inspect,但我想知道我是否可以依赖它:

我的用例是我必须获取一个类方法的类,但它Method#owner给了我特征类,并Method#receiver给了我当前的接收者:

有任何想法吗?

0 投票
1 回答
265 浏览

ruby - Ruby 1.8 与 1.9:确定 Ruby 单例类是否是另一个类的子类

前一个问题的答案中所述B < A这是确定一个类是否是另一个类的最简单方法。B但是,当是单例类(即特征类)时,这在 Ruby 1.8(也是 REE 1.8)中似乎失败了。为了显示:

如您所见,即使A被列为单例类 ( class << b; self; end)的祖先,false当您检查它是否是ARuby 1.8 中的子类时,它也会返回(但true在 1.9 中正确返回)。遵循#superclass链条似乎显示了为什么会这样:

有谁知道这是 1.8 中的一个错误,恰好在 1.9 中修复,或者可能是在 1.9 中有意改变的预期行为?我尝试在其他地方找到有关此问题的提及或文档,但找不到任何东西。

由于这个问题,有谁知道检查单例类是否是ARuby 1.8 中的子类的最佳方法是什么?我一直在做(class << b; self; end).ancestors.include?(A)一种解决方法,尽管它在技术上并不“正确”,因为祖先列表也包含包含的模块。

0 投票
1 回答
460 浏览

ruby - 通过include添加类方法

我有 Ruby 类,我想在其中包含类和实例方法。按照此处描述的模式,我目前正在使用以下内容:

我宁愿不制作两个单独的模块(一个被包含,另一个被扩展),因为我模块中的所有方法在逻辑上都适合在一起。另一方面,这种模式 a) 要求我定义一个附加ClassMethods模块,b) 要求我为每个模块编写一个样板self.included方法。

有一个更好的方法吗?

编辑1:我找到了另一种方法,但我不确定这是否比第一种更好。

0 投票
3 回答
654 浏览

ruby - 类、模块、它们的特征类和方法查找

让我们打开类Module并为其添加一个方法:

我可以通过这样做来调用这个方法,

这是可以理解的,因为 class of Classis Class,其超类 is Module。所以它可以调用定义在Module.

类和模块之间的关系

现在,bar下面的方法是在 的特征类上定义Module的:

但现在

也有效。

有人可以解释一下如何Class访问Moduleeigenclass 中的方法吗?


我想我现在明白了。方法查找不像我之前解释的那样工作。当我这样做时Class.foo,该方法在Class的 eigenclass 中搜索,然后它是超类,它是Moduleeigenclass 一直到BasicObject的 eigenclass,此时它会转向自身(就像一条蛇吃自己的尾巴)以在Class(的eigenclass)Class的超类也是BasicObject如此,然后是它的 superclass Module,它在那里找到方法。

同样,当我这样做时Class.bar,方法会在 ' 的 eigenclass 中搜索Class,然后在Module' 的 eigenclass 中找到它。

当我做

当我这样做时,猜测 wot 是输出:

这是我目前的理解: 目前的理解

0 投票
1 回答
312 浏览

ruby - Ruby 类 << Klass = Module::new

我在代码片段中有以下语法,但我不确定它的作用。

首先,文件/程序中不存在类或模块PushableModule,其次似乎正在发生的是我正在检索它的特征类,然后Module::new在定义一个块之前将其设置为等于,我只是不理解。有人可以向我解释一下(以及代码片段的实际作用)吗?

0 投票
2 回答
166 浏览

ruby - 红宝石什么时候出现特征类

在对象或类上定义单例方法之前是否存在特征类。即当定义了单例方法或类方法时,它们是否总是存在或存在?

0 投票
1 回答
68 浏览

ruby - 可以枚举特征类吗?

调用ObjectSpace.each_object(Class)似乎没有返回任何特征类。例如,在研究Ruby 元类时:为什么要定义三个单例方法?,我发现虽然ObjectSpace.count_objects[:T_CLASS]在使用类方法定义新类的情况下增加了 3,但ObjectSpace.each_object(Class).count仅增加了 1。

有没有办法枚举系统中活动的特征类?

0 投票
3 回答
65 浏览

ruby - define_method 和对象类:奇怪的行为


编辑:让我稍微扩展一下我的意图:

鉴于 ruby​​ 对象从其类的实例方法中获取其方法。

我试图“证明”的是,通过向该对象的类添加实例方法,它们将成为该对象本身的方法。

所以:

我实际上已经弄清楚为什么会发生这种情况。那是因为 Class.class 是......类!由于 Class 将 foo 作为其实例方法表的一部分,并且由于 Class.class 指向自身,因此它也将 foo 作为可调用的实例方法。

原帖如下:

只是为了更多地了解 Ruby 对象模型,我一直在做一些实验,以下行为让我感到惊讶:

假设我们有一个类测试:

然后,我们 class_eval Test.class 以便为 Test 对象添加一个方法:

(相当于调用 Test.class.send(:define_method,:foo) ... )

然后:

但是将 foo 发送到班级也可以:

不过,我仍然不知道为什么。类的单例类不包含它(我想到的唯一可能的解释是,该方法以某种方式添加到类的单例类中):

在这种情况下,方法查找如何工作?为什么发送 :foo 到 Test.class 也会调用该方法?我错过了什么吗?


作为参考,我对 Test 的实例做了同样的事情:

这按我预期的方式工作。

提前致谢!