为什么Scala可以支持这样的语法:new PrintWriter("文件名") { write("文件内容"); close }?

3

我有一个关于技巧的问题

new PrintWriter("/tmp/some.file") { write("file contents"); close }  

以下是我从这篇有趣的帖子中学到的内容:Scala: write string to file in one statement

这种技术在测试代码中非常有效,但是我对Scala语法中发生了什么有些困惑。

PrintWriter是一个Java类... 但是看起来像是将代码块传递给打印机实例,并且在该实例上隐式调用方法。PrintWriter Java类定义没有接受函数块的apply()方法。

因此... 我对Scala语法中发生了什么感到困惑

谢谢!

1个回答

6
这是因为你实际上正在创建一个匿名对象,该对象扩展了PrintWriter类。代码write("file contents"); close只是该匿名对象构造函数的一部分,因此它可以正常工作。
scala> val writer = new PrintWriter("/tmp/some.file") { write("file contents"); close }
writer: java.io.PrintWriter = $anon$1@6c07add6

scala> writer.getClass.getName
res4: String = $anon$1

1
将“anonymous object”翻译为“匿名类”。new SomeClass { ... }也是Java中的语法,但在Java中构造函数的代码需要显式声明。更多信息请参考https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html。 - pedrofurla
非常好的回答!我感到有些尴尬,竟然没有意识到;^) - Chris Bedford
@ChrisBedford 这种事情发生在我们最好的时候 :) - rogue-one

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接