case class Cat(name: String)
object CuterImplicits {
implicit class CatCuteChecker(c: Cat) {
def isCute(c: Cat) = true
}
}
trait CuteChecker[A] {
def isCute(a: A): Boolean
}
object CheckingForCuteness {
def isItCute[A](a: A) = implicitly[CuteChecker[A]].isCute(a)
}
object Main extends App {
CheckingForCuteness.isItCute[Cat](Cat("funny"))
}
直し方:
エラー:(17、37)パラメータeの暗黙的な値が見つかりませんでした:CuteChecker [A] def isItCute [A](a:A)=暗黙的に[CuteChecker [A]]。isCute(a)^
implicitly
を使用すると、単純に スコープ内の値が「明示的に」使用可能になります になります。したがって、isItCute
メソッドは、次の2つのバリアントのいずれかである必要があります。
def isItCute[A: CuteChecker](a: A) = implicitly[CuteChecker[A]].isCute(a)
def isItCute[A](a: A)(implicit cc: CuteChecker[A]) = cc.isCute(a)
次に、Cat
の暗黙的なインスタンスが必要です。 implicit class
は、タイプCat
の非暗黙的な値を必要とするため、ここでは役に立ちません。コンストラクターパラメーターが使用されないため、このアプローチが間違っていることがわかります。 implicit object
を使用できます:
implicit object CatCuteChecker extends CuteChecker[Cat] {
def isCute(c: Cat) = true
}
最後に、オブジェクトCuterImplicits
に暗黙を指定します。それらをMain
に表示するには、 コンテンツをインポート :する必要があります。
object Main extends App {
import CuterImplicits._
CheckingForCuteness.isItCute[Cat](Cat("funny"))
}
呼び出しの時点で、暗黙的nqualifiedである必要があります。暗黙的に見えるようになるさまざまな方法は、この回答で最もよく説明されています: https://stackoverflow.com/a/5598107/843348 。
また、何を達成しようとしているのかが完全には明確ではなく、何かを達成するためのいくつかの可能な方法がありますlike例。
1つの可能性は、暗黙のクラスを使用してCatにモンキーパッチを適用することです。
case class Cat(name: String)
object CuteImplicits {
implicit class CuteCat(c: Cat){
def isCute = true
}
}
object Main extends App {
import CuteImplicits._
Cat("funny").isCute
}
関連付けられたタイプのコンパニオンオブジェクトに暗黙を配置すると、自動的に表示されます。
case class Cat(name: String)
object Cat {
implicit class CuteCat(c: Cat){
def isCute = true
}
}
object Main extends App {
Cat("funny").isCute
}
このような最小限の例では、機能を直接Cat
に組み込まない理由が明確ではありません。
あなたの状況には複数の問題があります。 implicitly
呼び出しはCuteChecker
トレイトのインスタンスを予期しますが、CatCuteChecker
はインスタンスではなく、このトレイトを拡張しません。さらに、c
クラスパラメータは完全に不要です。
サブタイプの関係を宣言し、implicit
value:を指定することで、問題を修正できます。
object CuterImplicits
{
class CatCuteChecker with CuteChecker
{
def isCute(c: Cat) = true
}
implicit val catCuteChecker = new CatCuteChecker
}