Scala:包对象与包内的单例对象

Nik*_*Nik 6 scala library-design

我想将一组类似的函数分组到 scala 的库中。这是我在其他地方看到的两种方法。我想了解两者之间的差异。

包中定义的单例对象

// src/main/scala/com/example/toplevel/functions.scala
package com.example.toplevel

object functions {
  def foo: Unit = { ... }
  def bar: Unit = { ... }
}
Run Code Online (Sandbox Code Playgroud)

封装对象

// src/main/scala/com/example/toplevel/package.scala
package com.example.toplevel

package object functions {
  def foo: Unit = { ... }
  def bar: Unit = { ... }
}
Run Code Online (Sandbox Code Playgroud)

比较

据我所知,第一种方法需要functions在您想要使用其功能时显式导入该对象。而包对象方法允许包中的任何内容functions访问这些方法而无需导入它们。

即,com.example.toplevel.functions.MyClass可以隐式访问com.example.toplevel.functions.foo

我的理解正确吗?

如果 中没有定义类com.example.toplevel.functions,则这些方法似乎是等效的,这是正确的吗?

Nik*_*Nik 2

由terminally-chill 在评论中回答:

是的,你的理解是正确的。包对象中定义的任何内容都将可用,无需导入。如果您使用一个对象,即使在同一个包中,您也必须导入它。