短い答えは「いいえ、できません」です。
なぜですか? s
は変数ではないため、パラメータです。したがって、コンパイル時に実行時にある時点(たとえば最初のアクセス時)に設定されず、(暗黙的であるため)解決されます。
コードの一部にMyObject.a
を書き込むと、コンパイラは現在のスコープ内に暗黙的にString
の定義があるかどうかをチェックし、その定義をs
に使用します。
コードの別の部分でa
を使用すると、そのスコープ内の暗黙の定義が使用されますが、これは非常に異なる場合があります。
これはコンパイル時に検証されるため、実行時にメソッドにアクセスするときとは関係ありません(アクセス時には、回避可能なimplicitsがある場合はs
のランタイム値が変更される可能性があります。 )。
いつも同じ定義をs
に使用する場合は、単にこの定義をオブジェクトに入れないでください。または暗黙のようにそれをインポートします。
object MyObject {
implicit def myImplicitString: String = ??? //first possibility
import MyImplicits.stringImplicit //second possibility, if stringImplicit is indeed defined as implicit
}
一番下の行は、パラメータとして暗黙的に渡したくない場合は、あなたがスコープでそれを持っている必要があり、あり、そして、あなたの範囲がobject
ているので、それがなければなりません常に同じです。
しかし、class
を使用すると何が問題になりますか?多くの通話を変更することなく、暗黙のパラメータを繰り返すことを避けるために、MyObject.a
の代わりにnew MyClass().a
、またはcase class
と定義するとMyCaseClass().a
を使用します。オブジェクトに他のフィールドがある場合は、インスタンス化時のオーバーヘッドを最小限に抑えるために、それらのフィールドをクラスのコンパニオンオブジェクトに入れることができます。