Scala:包对象 v.s。包内的单例对象

Scala: package object v.s. singleton object within a package

我想在 scala 的库中对一组相似的函数进行分组。 这是我在其他地方看到的两种方法。我想了解 两者的区别。

包中定义的单例对象

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

object functions {
  def foo: Unit = { ... }
  def bar: Unit = { ... }
}

包对象

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

package object functions {
  def foo: Unit = { ... }
  def bar: Unit = { ... }
}

比较

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

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

我的理解对吗?

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

由 terminal-chill 在评论中回答:

yes, your understanding is correct. Anything defined in your package object will be available without having to import. If you use an object, you will have to import it even within the same package.