问题标签 [companion-object]

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 投票
2 回答
154 浏览

scala - 使用伴生对象时的方法名称限定

我只是在学习 Scala。我创建了一个伴随对象(参见下面的代码片段),其中定义了一个运算符 , ^(表示复杂共轭)。我必须使用关联类中的伴随对象名称来限定它。我的印象是我应该无条件地访问同伴的方法。如果我做错了什么,有人可以告诉我吗?

注意:这里使用了另一个类 Q,但未列出。

0 投票
3 回答
3990 浏览

scala - scala:防止伴随对象隐藏原始类的定义

我认为这更容易用一个例子来展示。

假设我有一个 Condition 案例类,其中有一个 Condition 伴随对象,用于提供替代构造函数,如下所示:

当我从另一个导入它时,我收到以下警告(最终变成错误):

我想在声明变量的类型时访问条件类型,并在执行其中一个方法时访问伴随对象

有什么方法可以实现这一点并避免这个警告(当然,除了重命名伴生对象)?

0 投票
8 回答
1709 浏览

scala - 如何谈论伴生对象与常规对象?

我是第一次教 Scala,我的学生发现伴随对象中涉及的故意“双关语”非常令人困惑。考虑以下示例:

当我使用诸如“堆栈对象”或“堆栈对象”或特别是“堆栈对象”之类的口头短语时,就会出现混淆。我的学生很难理解我是指单例对象 Stack 还是 Stack 类的对象。

我正在寻找替代方法来表达初学者可以更容易理解的内容。我一直考虑将 Stack 类的对象称为“堆栈实例”或“堆栈实例”,但是当试图教 OO 不能将这些东西称为对象时,这似乎很疯狂。在谈论单例对象 Stack 时,我一直在尝试始终使用短语“单例对象”或“伴随对象”,但 Scala 的语法在那里对我不利,因为它只使用“对象”一词。

在这种情况下,我可以重命名单例对象 StackFactory 而不是 Stack,但这只是我自己的类的一个选项,而不是已经内置在 Scala 中的一千零一个伴随对象。

编辑:

对不起,我的问题不够清楚。主要的混淆不是在引用伴随对象时发生。在这种情况下,正如一些人所指出的那样,使用诸如“伴生对象”之类的短语很容易。相反,主要的混淆发生在引用普​​通实例时。然后,如果我说“堆栈对象”(表示某个堆栈实例)或“堆栈对象”(表示这个特定实例),部分学生会认为我的意思是伴随对象——即使我没有使用词伴侣或单身人士。

而且我可以清楚地看到混淆的来源,因为“对象”一词仅与伴随对象一起出现在程序文本中。

0 投票
1 回答
290 浏览

scala - Scala中的定义顺序很重要吗?

在查找隐式时,Scala 编译器会在其他地方查找相关类的各个部分的伴生对象。但是,显然,如果在类本身中使用隐式转换(如果它是在伴随对象之前定义的),则它无法执行此查找。我能做的最小的例子是:

这无法编译说could not find implicit value for parameter c: Counter[Bar]- 我使用的是 Scala 2.9.1。

有趣的事情(由 rjsvaljean 建议)是,如果我们颠倒顺序 - 也就是说,我们object Bar之前定义case class Bar- 一切编译得很好。

这是编译器错误吗?或者我遗漏了一些关于 Scala 范围规则的内容?

我还应该提到,这个问题只出现在隐式解决方案中。如果我们显式地传递BarCounter对象,一切都编译得很好。

0 投票
3 回答
1797 浏览

java - 为什么将 Scala 伴随对象编译为两个类(Java 和 .NET 编译器)?

这段代码会被编译成java字节码,如果我反编译,那么等效的java代码是这样的:

它被编译成两个类,如果我使用Scala.net编译器,它会被编译成MSIL代码,等效的C#代码是这样的:

它也被编译成两个类。

为什么 Scala 编译器(用于 Java 的编译器和用于 .NET 的编译器)这样做?为什么不直接调用静态规则方法中的println方法呢?

0 投票
1 回答
1163 浏览

scala - 伴侣上的咖喱案例类构造函数

在定义案例类时,默认的伴随对象有很好的curried方法来获取案例类构造函数的柯里化版本:

但是,一旦我定义了一个明确的伴随对象,这个方法就会消失:

我可以像这样找回它:

但是,我想知道为什么在定义显式伴侣时它会消失(例如,与 相比apply)?

(斯卡拉 2.9.2)

0 投票
2 回答
216 浏览

scala - 我可以在伴生对象中使用“this”吗?

在伴生对象中,我想要一个记录从伴生类实例化的所有实例的字段(它是抽象的),我可以这样做吗?

特别是,我认为this会引用子类的任何实例,但是当我在伴随对象中使用它时它不会编译。

0 投票
3 回答
2620 浏览

class - Scala:从子类引用伴随对象

我正在考虑以下 Scala 类布局。我有一个代表 Item 的基本特征 - 一个应该是不可变对象的接口,我们可以通过调用以下方法查询名称、重量并执行一些特定于对象的事情equip

我可以创建Item实现,手动创建案例类,但我想要某种基于“字典”的项目 - 即静态映射保存从类型 ID 到值的映射,name并且weight方法只是使用存储类型查询字典ID:

到现在为止还挺好。我可以Weapon(1)用来引用“短剑”的项目对象。但是,相同的基本原理适用于任何其他项类型,例如Armor,它使用完全相同的nameweight实现,但完全不同equip的其他抽象方法实现,例如:

看起来很像Weapon,不是吗?我想将通用模式(即在伴随对象字典和通用typ值中查找的实现)分解为:

但是我如何Weapon.NameDict从父类中引用子类的伴随对象(如 )——即我应该使用什么来代替???.NameDict(typ)以及如何向编译器解释子类的伴随对象必须包含这些字典?对于这样的问题,是否有更好、更 Scala 风格的方法?

0 投票
2 回答
748 浏览

scala - Scala:生成伴随对象

无论如何,是否可以为某个类的每个子类自动生成一个伴随对象?

例如,我有class Component[T]一个val companion: CompType[T]whereT应该是子类。例如:class Transform extends Component[Transform]

有什么办法可以为每个子类生成伴随对象 - 虽然看起来很琐碎 - 以节省为我制作的每种组件输入对象定义?

编辑:

所有这一切的最终目标是一个实体系统。每个伴生对象都有一个唯一的整数(它从继承的特征中获取),可用于从组件数组中查找该特定类型的组件。例如,如果我想向实体添加一个 Transform 组件,我会调用:

然后,新Transform对象将被放置在表示由 Transform 伴随对象提供的索引处的实体的组件数组中。但是由于伴生对象从它们继承的特征中获取索引,因此除了它们的名称之外,它们之间没有任何类型的差异。因此,为什么生成它们会很好。

很抱歉一开始就没有更具体。如果这仍然令人困惑,那很可能是我只是以完全错误的方式做这件事!如果您这么认为,请随时告诉我。

0 投票
2 回答
1371 浏览

scala - 如何在基类中用可用的scala方法替换静态变量

我需要的:

那显然行不通。我试过的

并且编译器会给出错误,Child1因为它对函数sincos.

如何在将由其后代继承的基类中定义静态成员?