在Scala中增强预定义方法

fra*_*tnk 8 scala metaprogramming

基本问题:

为什么我只能用Scala写:

println(10)
Run Code Online (Sandbox Code Playgroud)

为什么我不需要写:

Console println(10)
Run Code Online (Sandbox Code Playgroud)

后续问题:

我怎样才能介绍一种新方法"foo",这种方法在任何地方都可见并且可以像"println"一样使用?

Jes*_*per 18

您不需要Console在语句前面编写,因为Scala Predef对象(自动为任何Scala源文件导入)包含以下定义:

def println() = Console.println()
def println(x: Any) = Console.println(x)
Run Code Online (Sandbox Code Playgroud)

您无法轻松创建一个自动可见的"全局"方法.你可以做的是将这些方法放在一个包对象中,例如:

package something

package object mypackage {
    def foo(name: String): Unit = println("Hello " + name")
}
Run Code Online (Sandbox Code Playgroud)

但是为了能够使用它,您需要导入包:

import something.mypackage._

object MyProgram {
    def main(args: Array[String]): Unit = {
        foo("World")
    }
}
Run Code Online (Sandbox Code Playgroud)

(注意:您可以将它放在常规对象,类或特征中,而不是包对象,只要您导入对象,类或特征的内容 - 但是包对象或多或少都用于此目的).

  • 包对象自动导入该包中的所有类和对象. (3认同)