ホーム>source

次のコードを実行する

import shapeless._
final case class Foo(s: String) { println("HELLO") }
object TestApp extends App {
  implicit def foo(implicit s: String): Foo = Foo(s)
  implicit val s : String = "123"
  implicitly[Foo]
  implicitly[Foo]
  val f1 = implicitly[Cached[Foo]].value
  val f2 = implicitly[Cached[Foo]].value
  println(f1 eq f2)
}

画面に3つの「HELLO」と表示され、比較結果は true

代わりに、これは私が得るものです、

HELLO
HELLO
HELLO
HELLO
false

Cached の使用方法についての私の理解が間違っている  ?

あなたの答え
  • 解決した方法 # 1

    def  呼び出された回数だけ評価されます。しかし、暗黙の def を変更した場合  によって val  あなたは1つの HELLO を持っています  および true

    非キャッシュとキャッシュの暗黙的な val の違い sは次のように表示できます(scaladocで記述されています)。

    trait TC[T] {
      def msg: String
    }
    object First {
      implicit val tc: TC[Int] = new TC[Int] {
        val msg = "first"
      }
      def print() = println(implicitly[TC[Int]].msg)
      def printCached() = println(Cached.implicitly[TC[Int]].msg)
    }
    object Second {
      implicit val tc: TC[Int] = new TC[Int] {
        val msg = "second"
      }
      def print() = println(implicitly[TC[Int]].msg)
      def printCached() = println(Cached.implicitly[TC[Int]].msg)
    }
    First.print()//first
    Second.print()//second
    First.printCached()//first
    Second.printCached()//first
    
    

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ wordpress - 管理インターフェイスコントロールでのGutenbergブロックコンポーネントの使用