Tag: 伴侣对象

如何谈论伴侣对象与常规对象?

我是第一次教Scala,我的学生们发现在伴侣对象中涉及的故意的“双关”非常混乱。 考虑下面的例子: class Stack { … methods such as push/pop } object Stack { … factory method(s) and possibly others } 当我使用诸如“堆栈对象”或“堆栈对象”或尤其是“堆栈对象”的语言短语时,会出现混淆。 我的学生很难理解我的意思是单个对象Stack还是Stack类的对象。 我正在寻找替代方法来expression这样的东西,初学者可以更容易地理解。 我一直认为Stack类的对象是“Stack实例”或“Stack的实例”,但是当试图教OO不能调用这些东西的时候,这似乎很疯狂。 在讨论单例对象Stack时,我一直试图总是使用“singleton object”或“companion object”这个短语,但是Scala的语法在这里与我一起工作,因为它只使用单词“object”。 在这种情况下,我可以重命名单个对象StackFactory而不是Stack,但这只是我自己的类的一个选项,而不是已经内置在Scala中的一千个和一个伴随对象。 编辑: 对不起,我的问题还不够清楚。 引用伴侣对象时不会发生主要的混淆。 在这种情况下,正如几个人所指出的那样,使用诸如“同伴对象”这样的短语是很容易的。 相反,当涉及到普通情况时会出现主要的混淆。 然后,如果我说“一个堆栈对象”(意思是一些堆栈实例)或“堆栈对象”(意思是这个特定的实例),一部分学生会认为我的意思是伴侣对象 – 即使我没有使用单词伴侣或单身人士。 而且我可以很好地看到混淆来自何处,因为单词“对象”只出现在伴随对象的程序文本中 。

为什么case类伴侣对象扩展FunctionN?

当你创build一个case类时,编译器会创build一个相应的伴随对象,其中包含一些case类的好东西:一个apply工厂方法匹配主构造函数equals , hashCode和copy 。 有点奇怪,这个生成的对象扩展了FunctionN。 scala> case class A(a: Int) defined class A scala> A: (Int => A) res0: (Int) => A = <function1> 只有在以下情况下才能这样做: 没有手动定义的伴侣对象 只有一个参数列表 没有types参数 案例类不是抽象的。 似乎是两年前添加的 。 最新的化身在这里 。 有没有人使用这个,或知道为什么被添加? 它使用静态转发器方法稍微增加了生成的字节码的大小,并显示在伴随对象的#toString()方法中: scala> case class A() defined class A scala> A.toString res12: java.lang.String = <function0> UPDATE 使用单个apply方法手动创build的对象不会被自动视为FunctionN : object HasApply { def […]

在Scala中有伴侣对象的基本原理是什么?

有没有一个类的伴侣对象(单身人士)的情况下需要? 为什么我要创build一个类,说Foo并为它创build一个伴侣对象?