Scala 3 supports toplevel functions, which are functions that are not contained inside a class, trait, or object.
Conversely, in Scala 2, all functions and methods must be inside one of those containers (class, trait, or object).
In Scala 3, values can also be at the top level of your code.
I have seen “toplevel” spelled as toplevel, top level, and top-level.
Toplevel function example
Here’s an example of two toplevel functions in a small Scala script:
// toplevel function def sayHello(name: String): Unit = println(s"Hello, $name") // toplevel function def containsSubstringIgnoreCase(s: String, substring: String): Boolean = s.toUpperCase.contains(substring.toUpperCase) // toplevel value val lookFor = "al" @main def helloWorld(name: String): Unit = sayHello(name) if containsSubstringIgnoreCase(name, lookFor) then println(s"Congratulations, your name contains '$lookFor'!") else println(s"Sorry, your name doesn’t contain '$lookFor'.")
As shown, functions are now free to be outside of containers, which is nice in some situations, such as scripts and small applications.