Scala 3 — Book

Given Imports

Language
This doc page is specific to Scala 3, and may cover new concepts not available in Scala 2. Unless otherwise stated, all the code examples in this page assume you are using Scala 3.

To make it more clear where givens in the current scope are coming from, a special form of the import statement is used to import given instances. The basic form is shown in this example:

object A:
  class TC
  given tc: TC = ???
  def f(using TC) = ???

object B:
  import A.*       // import all non-given members
  import A.given   // import the given instance

In this code the import A.* clause of object B imports all members of A except the given instance, tc. Conversely, the second import, import A.given, imports only that given instance. The two import clauses can also be merged into one:

object B:
  import A.{given, *}

Discussion

The wildcard selector * brings all definitions other than givens or extensions into scope, whereas a given selector brings all givens—including those resulting from extensions—into scope.

These rules have two main benefits:

  • It’s more clear where givens in the current scope are coming from. In particular, it’s not possible to hide imported givens in a long list of other wildcard imports.
  • It enables importing all givens without importing anything else. This is important because givens can be anonymous, so the usual use of named imports is not practical.

More examples of the “import given” syntax are shown in the Packaging and Imports chapter.

Contributors to this page: