æé»ã®å¼æ° (implicit parameters)
å¼æ°ã®åã«åãããæé»ã®å¤ãæå®ãã¦ããã¨ãé¢æ°(ã¡ã½ãã)å¼ã³åºãæã®å¼æ°ãçç¥ã§ããã
é¢æ°å®ç¾©ã®å¼æ°ãªã¹ãã§å¼æ°åã®åã« implicit ãä»ããã¨æé»ã®å¼æ°ãé©ç¨ãããã
å¼æ°ãçç¥ããªãã¨ãã¯é¢æ°å¼ã³åºãæã®æå®å¤ããã®ã¾ã¾æ¸¡ãããã
implicit ã¯å¼æ°ãªã¹ãå
ã®å
é ã®å¼æ°ä»¥å¤ã«ã¯æå®ã§ããªãããããã¯åå¥ã®å¼æ°ã¸ã®æå®ã§ã¯ãªã
å¼æ°ãªã¹ãå
¨ä½ã«é©ç¨ããã¦ããã
ããã©ã«ãå¼æ°ã«ããä¼¼ã¦ããããããã©ã«ãå¼æ°ã¯ãé¢æ°ã®å®ç¾©ã§ããã©ã«ãå¤ãæå®ãã
ã®ã«å¯¾ãã¦æé»ã®å¼æ°ã¯å¼ã³åºãå
ã§å¼ãæ°ã®æé»ã®å¤ãå®ç¾©ããã
ä¾ã§ã¯ãä¸è¬ç㪠Int 㨠Long ã«ããããããæé»ã®å¼æ°ãå®ç¾©ãã¦ããããé常ã¯åå¥ã«åã
ä½ã£ã¦å¶ç¶ã®åã®ä¸è´ãèµ·ãããªãããã«ããã®ãè¯ãããã§ããã
scala> def foo(a: Int, implicit b: Long): Long = a * b <console>:1: error: identifier expected but 'implicit' found. def foo(a: Int, implicit b: Int) = a * b ^ scala> def foo(implicit a: Int, b: Long): Long = a * b foo: (implicit a: Int, implicit b: Long)Long scala> implicit val defValue = 10 defValue: Int = 10 scala> implicit val defLValue = 20L defLValue: Long = 20 scala> foo res1: Long = 200 scala> foo(3, 4) res2: Long = 12
è¤æ°ã®å¼æ°ãªã¹ããã¨ãé¢æ°ã®æå¾å°¾ã®å¼æ°ãªã¹ã以å¤ã«æé»ã®å¼æ°ã¯é©ç¨ã§ããªãã
scala> def bar(a: Short)(implicit b: Long, c: Int): Long = a + b * c bar: (a: Short)(implicit b: Long, implicit c: Int)Long scala> bar(5) res3: Long = 205 scala> def foo2(implicit a: Int)(b: Int): Int = a * b <console>:1: error: '=' expected but '(' found. def foo2(implicit a: Int)(b: Int): Int = a * b ^ scala> def foo3(a: Int)(implicit b: Long)(c: Short): Long = a * b + c <console>:1: error: '=' expected but '(' found. def foo3(a: Int)(implicit b: Long)(c: Short): Long = a * b + c ^ scala> def foo4(implicit a: Int)(implicit b: Long): Long = a * b <console>:1: error: '=' expected but '(' found. def foo4(implicit a: Int)(implicit b: Long): Long = a * b ^
å¼ã³åºããé¢æ°ã§é©ç¨ããæé»ã®å¼æ°ã®åã® implicit val å®ç¾©ã
ã¹ã³ã¼ãå
ã«ãªããã°ã¨ã©ã¼ã«ãªãã
scala> def bar2(a: Int)(implicit b: Long, c: Short): Long = a + b * c bar7: (a: Int)(implicit b: Long, implicit c: Short)Long scala> bar2(7) <console>:11: error: could not find implicit value for parameter c: Short bar2(7) scala> implicit val defSValue: Short = 5 defSValue: Short = 5 scala> bar2(7) res8: Long = 107
å¼ã³åºããé¢æ°ã§é©ç¨ããæé»ã®å¼æ°ã®åã®implicit val ã®å®ç¾©ãã¹ã³ã¼ãå
ã§
2ã¤ä»¥ä¸ããå ´åãã¨ã©ã¼ã«ãªãã
scala> implicit val defs2: Short = 3 defs2: Short = 3 scala> bar2(7) <console>:13: error: ambiguous implicit values: both value defSValue in object $iw of type => Short and value defs2 in object $iw of type => Short match expected type Short bar2(7) ^
ããã¹ã³ã¼ãã§ãåã«å®ç¾©ãã¦ããæé»ã®å¤ã確èªããã«ã¯ Predef ã® implicitly[å] ã¡ã½ããã使ãã
scala> implicitly[Int] res10: Int = 10 scala> implicitly[Long] res11: Long = 20
Predef ã® implicitly ã® å®ç¾©
def implicitly[T](implicit e: T): T = e