Implicits can be used to declare a value to be provided as a default as long as an implicit value is set with in the scope.
Implicits can be used to declare a value to be provided as a default as long as an implicit value is set with in the scope. These are called Implicit Function Parameters:
Implicits can be used to automatically convert a value's type to another:
Default arguments, though, are preferred to Implicit Function Parameters:
The actual arguments that are eligible to be passed to an implicit parameter fall into two categories:
The actual arguments that are eligible to be passed to an implicit parameter fall into two categories:
In the following example we define a method sum
which computes the sum of a list of elements using the monoid's add
and unit
operations. Please note that implicit values can not be top-level, they have to be members of a template.
abstract class SemiGroup[A] { def add(x: A, y: A): A } abstract class Monoid[A] extends SemiGroup[A] { def unit: A } object ImplicitTest extends App { implicit object StringMonoid extends Monoid[String] { def add(x: String, y: String): String = x concat y def unit: String = "" } implicit object IntMonoid extends Monoid[Int] { def add(x: Int, y: Int): Int = x + y def unit: Int = 0 } def sum[A](xs: List[A])(implicit m: Monoid[A]): A = if (xs.isEmpty) m.unit else m.add(xs.head, sum(xs.tail)) println(sum(List(1, 2, 3))) println(sum(List("a", "b", "c"))) }
Here is the output of the Scala program:
6
abc
Implicits wrap around existing classes to provide extra functionality. This is similar to monkey patching in Ruby and meta-programming in Groovy.
Creating a method isOdd
for Int
, which doesn't exist:
Implicits rules can be imported into your scope with an import:
Implicit Function Parameters can contain a list of implicits:
The parameterless execute method has been deprecated and will be removed in a future version of ScalaTest. Please invoke execute with empty parens instead: execute().
The trap method is no longer needed for demos in the REPL, which now abreviates stack traces, and will be removed in a future version of ScalaTest