/ / scala:ライブラリは暗黙的に宣言される値を探しています - scala、scope、implicit

scala:ライブラリは、宣言される暗黙の値を探しています - scala、scope、implicit

私は2つの輸入品を使用しています

import org.json4s._
import org.json4s.native.JsonMethods._

私は次のソースコードを持っています

val json = parse("~~~~~~aklsdjfalksdjfalkdsf")
var abc = (json \ "something").children map {
_.extract[POJO]
}

私はそれを実行した後、私は見た

Error:(32, 18) No org.json4s.Formats found. Try to bring an instance of org.json4s.Formats in scope or use the org.json4s.DefaultFormats.
_.extract[POJO]

Error:(32, 18) not enough arguments for method extract: (implicit formats: org.json4s.Formats, implicit mf: scala.reflect.Manifest[POJO])POJO.
Unspecified value parameters formats, mf.
_.extract[POJO]

私は宣言すべきであることを知っている:

 implicit val df = DefaultFormats

私は自分のスカラコードに "暗黙的に"使う方法を学びました。 しかし、私は、開発者に暗黙の変数をソースコードで定義させるライブラリを使用する方法を理解する必要があります。

エラーメッセージに記載されているように、 "implicit"キーワードがExtractableJsonAstNodeクラスファイルの "extract"メソッドで使用されているようです。

 def extract[A](implicit formats: Formats, mf: scala.reflect.Manifest[A]): A =
Extraction.extract(jv)(formats, mf)

私はそれが私のソースコードで宣言される "暗黙の"可変キーワードを探しているのを見ます。

最初の質問暗黙のキーワードが別の暗黙的なキーワード(例えば、図書館で宣言されている)に使用されることを知るにはどうすればよいですか? または それは私が定義する操作の切り替えになるでしょう(2回宣言されない "暗黙の"場合) 私が持っている唯一の手掛かりは、マザーソースコード"暗黙の"キーワードを使用していて、変数を使用しており、その型は特性です。次に、私(dev)はその特性を拡張する具体的なクラスの型で変数を宣言する必要があります。本当..

また、jsonライブラリ内の "Formats.scala"ファイルに次のソースコードがあります。

 class CustomSerializer[A: Manifest](
ser: Formats => (PartialFunction[JValue, A], PartialFunction[Any, JValue])) extends Serializer[A] {

val Class = implicitly[Manifest[A]].runtimeClass

def deserialize(implicit format: Formats) = {
case (TypeInfo(Class, _), json) =>
if (ser(format)._1.isDefinedAt(json)) ser(format)._1(json)
else throw new MappingException("Can"t convert " + json + " to " + Class)
}

def serialize(implicit format: Formats) = ser(format)._2
}

ご了承ください def deserialize(implicit format: Formats) 宣言されています。 一度私のファイルに "暗黙のval df = DefaultFormats"を書いたら、それは "抽出"メソッドだけでなく、Jsonのメカニズム全体に影響を及ぼしますか? CustomSerializerはjsonライブラリで使用されます。

要約すると.. 最初の質問は「暗黙の」キーワードの使用法の1つです。 2番目の質問は「暗黙の」キーワードスコープです。

回答:

回答№1は0

暗黙のキーワードはいつ使用しますか?

インプリシットは、通常は制御できないものの動作を解消するために使用されます。あなたの質問では、 DefaultFormats すでに暗黙的です。あなたはそれを使用して新しい暗黙の宣言する必要はありません、あなたはそれをインポートすることができます。

あなたが使っているライブラリがスコープに何らかの暗黙的なものを必要としていることを知っている限り、そのエラーはそれです。 DefaultFormats.

暗黙的にメカニズム全体に影響を与えるか?

これは、理解するために重要な重要な質問です。

暗黙のうちに関数を使用すると、コンパイラは暗黙的にスコープを検索します そのタイプの.

あなたの機能が探している org.json4s.Formats。インポートすることで DefaultFormat あなた自身のタイプの暗黙的な記述 Formatそのフォーマットを使用するために関数を呼び出すことになります。

これは残りのコードにどのような影響がありますか?

どれか その他 あなたが暗黙的に依存している機能 Format スコープ内で同じ暗黙的に使用されます。これはおそらくあなたにとっては大丈夫です。

複数の異なるフォーマットを使用する必要がある場合は、それらのコンポーネントを互いに分割したいと思うでしょう。同じスコープ内で同じタイプの複数のimplicitを定義する必要はありません。これは人間やコンピュータにとっては紛らわしく、避けるべきです。