Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 类实例化返回一个函数对象_Scala - Fatal编程技术网

Scala 类实例化返回一个函数对象

Scala 类实例化返回一个函数对象,scala,Scala,我试图理解,当我创建一个扩展特性的类时,我相信它扩展了Function0[()=>Unit],为什么该类的对象实例化的类型是Function0?在对象实例化期间,apply方法是否作为构造函数调用?我不能完全理解下面代码的机制 scala> trait Base extends (() => Unit) { | | def label: String | } defined trait Base scala> class Extend extends Base{

我试图理解,当我创建一个扩展特性的类时,我相信它扩展了Function0[()=>Unit],为什么该类的对象实例化的类型是Function0?在对象实例化期间,apply方法是否作为构造函数调用?我不能完全理解下面代码的机制

scala> trait Base extends (() => Unit) {
 |
 |    def label: String
 | }
defined trait Base

scala> class Extend extends Base{
 | override def label = "Hello label"
 | override def apply()= println ("This is apply")
 |
 | }
defined class Extend

scala> val m = new Extend
m: Extend = <function0>

scala> m()
This is apply
scala>trait Base扩展(()=>Unit){
|
|def标签:字符串
| }
定义性状库
scala>类扩展扩展基{
|覆盖def label=“你好标签”
|覆盖def apply()=println(“这是应用”)
|
| }
定义类扩展
scala>val m=新扩展
m:扩展=
scala>m()
这是适用的
这个
东西不是类型。这只是
Function0
上定义的默认
toString
方法的输出。您不会在任何地方重写
toString
,因此它使用来自超类的实现。添加像
label
这样的方法不会改变任何东西,编译器无法读取(您的想法)

小演示:

scala> val f = new Function0[Int]{ def apply(): Int = 42 }
f: () => Int = <function0>

scala> f.toString
res0: String = <function0>
scala>val f=new Function0[Int]{def apply():Int=42}
f:()=>Int=
scala>f.toString
res0:String=

另一方面,您的示例中的类型正确地显示为
Extend

谢谢@Andrey,但我想知道的是,为什么
新的Extend
属于函数0的类型,是因为
扩展基本函数0
?另外,不是
而是
Extend@
来表示类的对象吗?@jjayadeep
new Extend
Extend
类型。repl正好显示:
m:Extend
。因为您刚刚对
Function0
进行了子类化,
Extend
也恰好是
Function0
的子类型,所以我不确定您到底对它感到了什么惊讶?好吧,我得到了它,=表示法是因为toString方法。通常,当我们在REPL中创建新类时,它会给出一个对象引用,如下所示Class@number我相信这是AnyRef的toString方法,但在本例中,它使用函数0中的toString。@jjayadeep它给出的内容某种程度上取决于已经提供的
toString
-方法。。。例如,
case
-类通常会产生更好的人类可读输出,没有任何散列号等。我认为您刚刚混淆了repl的
结果:Type=ToString
-输出中的
类型和
ToString
部分,但是现在这似乎很清楚了。@jjayadeep…构造函数没有调用
apply
。它与构造函数没有任何关系。
apply
只是一种常用的方法,只是它有一些语法上的糖分:
m()
将其分解为
m.apply()