Skip to content

Latest commit

 

History

History
71 lines (49 loc) · 2.75 KB

File metadata and controls

71 lines (49 loc) · 2.75 KB
Topic Using implicits to write expressive code
Git sample ImplicitParamTest.scala & ImplicitFuncTest.scala & ImplicitClassTest.scala

  • There's a fundamental difference between your own code and other libraries. You can update or extend your own code, but you can't do the same with other libraries

  • Scala has implicit parameters and conversions. They can make existing libraries much more pleasant to deal with

  • Say you have a value x of type Array[int] and you want to assign this value to some variable of type String

    var v: String = x
  • Line above would give a type error, because Array[int] does not confirm to String. However a conversion from Array to String can help

    implicit def array2string[T](x: Array[T]) = x.toString
  • The conversion is automatically inserted by using implicit method array2string

    var v: String = array2string(x)
  • Scala implicit provides ability to write classes and methods that can be reused anytime they’re needed

  • An implicit keyword can be used in three ways

    • Implicit Parameters: Example below shows how method 'square' takes context bound implicit Int value '2' from the context
    object ImplicitParamTest {
    
    	 /* Compiler will bind 'implicit val value = 2' to the context in which they are called */
    	implicit val value = 2
    
    	/* Method 'square' call does not provides any parameter of type Int as desired in definition */
    	/* If variable is 'implicit', compiler will look for a variable of type Int in the implicit scope */
    	/* Compiler will find 'implicit val value = 2' and will pass value '2' while calling 'square' method */
    	def main(args: Array[String]): Unit = println(square)
    
    	def square(implicit value: Int) = value * value
    }
    • Implicit Conversions with Classes: Example below adds a new method sayHello to String class
    object ImplicitClassTest {
    
      def main(args: Array[String]): Unit = {
    
    	/* Create new variable 'name' */
    	val name = "InBravo"
    
    	/* See carefully that 'sayHello' does not belong to original Predef.String */
    	println(name.sayHello)
      }
    
      /* Implicit class with a method 'sayHello'. A constructor parameter is must for any implicit class */
      implicit class Greeter(val name: String) {
    
    	/* All the methods of any implicit class are bound to context */
    	def sayHello = "Hello " + name;
      }
    }
    • Implicit conversions using functions: