问题标签 [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.
scala - 使用伴生对象时的方法名称限定
我只是在学习 Scala。我创建了一个伴随对象(参见下面的代码片段),其中定义了一个运算符 , ^
(表示复杂共轭)。我必须使用关联类中的伴随对象名称来限定它。我的印象是我应该无条件地访问同伴的方法。如果我做错了什么,有人可以告诉我吗?
注意:这里使用了另一个类 Q,但未列出。
scala - scala:防止伴随对象隐藏原始类的定义
我认为这更容易用一个例子来展示。
假设我有一个 Condition 案例类,其中有一个 Condition 伴随对象,用于提供替代构造函数,如下所示:
当我从另一个导入它时,我收到以下警告(最终变成错误):
我想在声明变量的类型时访问条件类型,并在执行其中一个方法时访问伴随对象
有什么方法可以实现这一点并避免这个警告(当然,除了重命名伴生对象)?
scala - 如何谈论伴生对象与常规对象?
我是第一次教 Scala,我的学生发现伴随对象中涉及的故意“双关语”非常令人困惑。考虑以下示例:
当我使用诸如“堆栈对象”或“堆栈对象”或特别是“堆栈对象”之类的口头短语时,就会出现混淆。我的学生很难理解我是指单例对象 Stack 还是 Stack 类的对象。
我正在寻找替代方法来表达初学者可以更容易理解的内容。我一直考虑将 Stack 类的对象称为“堆栈实例”或“堆栈实例”,但是当试图教 OO 不能将这些东西称为对象时,这似乎很疯狂。在谈论单例对象 Stack 时,我一直在尝试始终使用短语“单例对象”或“伴随对象”,但 Scala 的语法在那里对我不利,因为它只使用“对象”一词。
在这种情况下,我可以重命名单例对象 StackFactory 而不是 Stack,但这只是我自己的类的一个选项,而不是已经内置在 Scala 中的一千零一个伴随对象。
编辑:
对不起,我的问题不够清楚。主要的混淆不是在引用伴随对象时发生。在这种情况下,正如一些人所指出的那样,使用诸如“伴生对象”之类的短语很容易。相反,主要的混淆发生在引用普通实例时。然后,如果我说“堆栈对象”(表示某个堆栈实例)或“堆栈对象”(表示这个特定实例),部分学生会认为我的意思是伴随对象——即使我没有使用词伴侣或单身人士。
而且我可以清楚地看到混淆的来源,因为“对象”一词仅与伴随对象一起出现在程序文本中。
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
对象,一切都编译得很好。
java - 为什么将 Scala 伴随对象编译为两个类(Java 和 .NET 编译器)?
这段代码会被编译成java字节码,如果我反编译,那么等效的java代码是这样的:
它被编译成两个类,如果我使用Scala.net编译器,它会被编译成MSIL代码,等效的C#代码是这样的:
它也被编译成两个类。
为什么 Scala 编译器(用于 Java 的编译器和用于 .NET 的编译器)这样做?为什么不直接调用静态规则方法中的println方法呢?
scala - 伴侣上的咖喱案例类构造函数
在定义案例类时,默认的伴随对象有很好的curried
方法来获取案例类构造函数的柯里化版本:
但是,一旦我定义了一个明确的伴随对象,这个方法就会消失:
我可以像这样找回它:
但是,我想知道为什么在定义显式伴侣时它会消失(例如,与 相比apply
)?
(斯卡拉 2.9.2)
scala - 我可以在伴生对象中使用“this”吗?
在伴生对象中,我想要一个记录从伴生类实例化的所有实例的字段(它是抽象的),我可以这样做吗?
特别是,我认为this
会引用子类的任何实例,但是当我在伴随对象中使用它时它不会编译。
class - Scala:从子类引用伴随对象
我正在考虑以下 Scala 类布局。我有一个代表 Item 的基本特征 - 一个应该是不可变对象的接口,我们可以通过调用以下方法查询名称、重量并执行一些特定于对象的事情equip
:
我可以创建Item
实现,手动创建案例类,但我想要某种基于“字典”的项目 - 即静态映射保存从类型 ID 到值的映射,name
并且weight
方法只是使用存储类型查询字典ID:
到现在为止还挺好。我可以Weapon(1)
用来引用“短剑”的项目对象。但是,相同的基本原理适用于任何其他项类型,例如Armor
,它使用完全相同的name
和weight
实现,但完全不同equip
的其他抽象方法实现,例如:
看起来很像Weapon
,不是吗?我想将通用模式(即在伴随对象字典和通用typ
值中查找的实现)分解为:
但是我如何Weapon.NameDict
从父类中引用子类的伴随对象(如 )——即我应该使用什么来代替???.NameDict(typ)
以及如何向编译器解释子类的伴随对象必须包含这些字典?对于这样的问题,是否有更好、更 Scala 风格的方法?
scala - Scala:生成伴随对象
无论如何,是否可以为某个类的每个子类自动生成一个伴随对象?
例如,我有class Component[T]
一个val companion: CompType[T]
whereT
应该是子类。例如:class Transform extends Component[Transform]
。
有什么办法可以为每个子类生成伴随对象 - 虽然看起来很琐碎 - 以节省为我制作的每种组件输入对象定义?
编辑:
所有这一切的最终目标是一个实体系统。每个伴生对象都有一个唯一的整数(它从继承的特征中获取),可用于从组件数组中查找该特定类型的组件。例如,如果我想向实体添加一个 Transform 组件,我会调用:
然后,新Transform
对象将被放置在表示由 Transform 伴随对象提供的索引处的实体的组件数组中。但是由于伴生对象从它们继承的特征中获取索引,因此除了它们的名称之外,它们之间没有任何类型的差异。因此,为什么生成它们会很好。
很抱歉一开始就没有更具体。如果这仍然令人困惑,那很可能是我只是以完全错误的方式做这件事!如果您这么认为,请随时告诉我。
scala - 如何在基类中用可用的scala方法替换静态变量
我需要的:
那显然行不通。我试过的
并且编译器会给出错误,Child1
因为它对函数sin
和cos
.
如何在将由其后代继承的基类中定义静态成员?