问题标签 [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 投票
0 回答
72 浏览

ruby-on-rails - 这些只是在 Ruby 中定义静态方法的不同方式吗?

根据我所知道的,是的,但我对红宝石不熟悉,想确定一下。他们的工作有区别吗?有理由使用一种语法而不是另一种吗?

如果在类/模块的上下文之外使用,我确实知道class << self并且def self.method表现不同,因为self是不同的。

我见过Ruby 的 class << self vs self.method:什么更好?它没有谈论Foo.method声明的方式。


由于我无法发布答案,因此我将在此处添加答案:

看起来我的问题是为ruby​​ 规范中的本节量身定制的(或http://www.ipa.go.jp/osc/english/ruby/以防直接链接不起作用)。

简而言之,这是在 Ruby 中定义单例方法的 3 种不同方式。和:

类的单例方法类似于其他面向对象语言中所谓的类方法,因为它们可以在该类上调用。


0 投票
1 回答
116 浏览

ruby - Builder 的 XmlMarkup 对象丢失常量?

我尝试将旧版应用程序从 Ruby 1.8.7 升级到 2.2.3。之后,构建器模板的呈现会引发有关未知类的错误。

未初始化的常量 Builder::XmlMarkup::BigDecimal (NameError)

在 Builder::XmlMarkup 中,类等常量似乎消失了。

我没有发现这种行为的原因。我该如何解决这个问题?

顺便说一句:我对方法查找也有同样的问题,例如,它返回完整的 XML 文档但在 Ruby 2.2.3format('%d', 42)中没有调用。Kernel.format

0 投票
1 回答
51 浏览

ruby - 为什么fixnum没有特征类?

这个方法是返回任何对象的特征类:

字符串示例:

大批:

但是使用 Fixnum:

为什么?

0 投票
1 回答
288 浏览

ruby - 如何使模块常量在特征类中也可见?

我创建了一个包含常量NAME和方法的模块hello。如果一个类包含该模块,则两个定义都应该在不同的范围内可见。

但是该常量在 eigenclass 的实例方法范围内不可见,class << self.

有没有办法使模块更健壮并在上述错误范围内提供常量?

0 投票
2 回答
47 浏览

ruby - 一个 Ruby 对象可以有多个特征类吗?

特征类被添加到继承层次结构中。

如果添加了多个单例方法,这些方法是添加到同一个特征类中,还是注入到该对象的继承层次结构中的不同特征类中?

例如

这会添加 2 个特征类:一个带有“test”方法,另一个带有“test2”方法?还是一个具有两种方法的特征类?

0 投票
1 回答
134 浏览

ruby - Ruby:当您打开对象 eigenclass 并对其进行更改时,提供真实世界的示例

来自 C# 世界,我习惯于认为类是对象的不可变定义,并且每个对象都有固定的类。

我试图敞开心扉接受使用的可能性

我不是在谈论class << self
我说的是更改一个或多个对象的类定义,但并非所有对象都喜欢class << self

在使用 ruby​​ 的几个月或将近一年的时间里,我从来没有发现过这样一种情况,我认为哦,太好了,我可以打开这个对象的 eigenclass 并更改它,并使大多数其他同类对象保持不变。请在使用时提供真实世界的示例。

0 投票
1 回答
24 浏览

ruby - 如何在 Ruby 中创建一个执行先前给定块的方法?

我有一个为子类化而构建的类。

在我的用例中,我不想创建子类,因为我只需要一个实例。因此,我将更改initialize方法以支持以下用法。

我怎么能支持上面的用法?


顺便说一句:我为 Ruby 1.8.7 项目找到了以下解决方案,但它们对我来说看起来很尴尬。

0 投票
1 回答
341 浏览

ruby - Ruby 中 BasicObject 的单例类的单例类

这主要是一个“学术”,但在这里:

根据this Ruby eigenclass diagram(稍作编辑):

可能错误的 Ruby 特征类图

BasicObject.singleton_class.singleton_class.superclassClass

但是,在 Ruby 解释器(Ruby v2.5.1)上运行它,结果是BasicObject.singleton_class.singleton_class.superclassis#<Class:Class>而不是Class. 因此,图表是在说谎还是我错过了什么?

该图来自我在 Freenode 的 Ruby IRC 聊天的一位用户。然而,它被许多其他用户多次引用,并被视为 Ruby 对象模型圣经。

0 投票
0 回答
216 浏览

python - Python 对象的状态相关行为,使用带有 mixin 的类 Ruby 特征类

我一直在寻找一种自然的方式来在 Python 对象中实现与状态相关的行为(状态机)。目标是让对象拥有少量的状态,或状态的“相互正交”方面,这将决定它们在每一刻的具体行为。也就是说,返回的方法x.foo应该由 的当前状态决定x,如果x其状态发生变化,其部分或全部方法的实现也应该相应改变。(我认为有些人称之为“状态设计模式”。)

最直接的解决方案是将方法存储为对象属性:

但是,将所有方法存储为对象属性看起来像是浪费内存,并且在每次状态更改时更新所有方法看起来像是浪费时间/精力。此外,这种方法不适用于特殊的方法名称,如__str__or __len__(除非它们被设置为委托给“普通”方法)。

很自然地想到每个状态都有一个单独的mixin 。所以我想出了如何使用类似 Ruby 的特征类和突变黑客使mixins作为状态工作:__bases__

该代码可以适应状态不是“整体”但可以分解为较小状态的产物的情况:Eigenclass在其基础中需要有多个mixin“代理”等。

是否已经描述或测试过这种或任何类似的使用 mixins 作为状态的方法?它有什么严重的问题吗?有没有“更好”的选择?


更新。

我已经意识到使用__bases__突变的一个重要实际问题:它必须是一个相对昂贵的操作,因为每次它都需要运行C3 线性化算法来构建 MRO 链。因此,根据每次状态变化进行修改是非常昂贵的。事实上,尝试在实践中应用这种方法时,与我之前的解决方案相比,我发现速度大幅放缓。

我希望有一种廉价的方法来动态地将类添加到 MRO 链中。我将尝试mro使用元类直接破解...

0 投票
3 回答
239 浏览

ruby - 为什么我可以使用像“puts”这样的内核单例方法?

在 Ruby 中,该方法putsKernel模块的单例方法。

通常,当一个模块被另一个模块included 或extended 时,该模块(但不是它的单例类)被添加到继承树中。这有效地使模块的实例方法可用于模块或其单例类(分别为includeextend)......但是混合模块的单例方法仍然不可访问,因为模块的单例类不是曾经添加到继承树中。

那么为什么我可以使用puts(和其他内核单例方法)?

请注意,这puts 似乎不是实例方法Kernel

虽然Object包括Kernel

据我所知,Kernel的单例类 ( #<Class:Kernel>) 不会出现在任何对象的祖先中。is_a?似乎同意这一点:

然而,出于某种原因,它们显示为每个对象的私有方法。

如果#<Class:Kernel>没有出现在祖先链中,方法查找如何找到这些方法?

有关的: