2016-07-28 8 views
6

私はscalaLangによってtwitterの面白い投稿を見つけました。このコードがコンパイルされて動作する場所2つの意味を持つscalaの変数を定義する

class A(implicit implicit val b: Int) 

val objA = new A()(42) 

誰かが私に説明してくれますか?私は含意の文書を読んだが、このような事例は見つからなかった。ここで何が起こっているのか教えてください。

ご協力いただきましてありがとうございます。

答えて

2

クラスまたはメソッドの最後のパラメータリストの前、およびクラスまたは特性のメンバーの前には、implicitを含めることができます。これは単に両方を組み合わせるだけです。これは、言語仕様とパーサを実際には役に立たないように少し複雑にすることを禁じているためです。私はこれを使用する理由がないと思います。またはimplicitと書くこととの違いは一度もありません。

3

何か掘り下げた後、私は@Alexey Romanovが言ったことを確認します。私たちはこのようにそれを使用することができ

case class A(implicit implicit val a: Int) 

def foo(x: Int)(implicit y: Int): Int = x * y 

implicit val m: Int = 2 
val myA = A() 

そして、次のアプリケーション例:次考えてみましょう、それは暗黙的にnがかかるので

val myAA = A()(2) 
val n = myAA.a 
foo(3) 

を、明らかにfoo(3)は、6が得られます。我々は

case class A(implicit val a: Int)

にクラスを変更した場合には、fooの動作を変更しません。したがって、@Alexey - 最初のimplicitがコンストラクタパラメータを暗黙的に渡すことができるという同じ結論に達します。 2番目のものは暗黙的な値を定義しています - この場合でも同じことをします。

+0

私が間違っていると私を修正しますが、 'foo'は暗黙的に' m'をとります。 'n == m'という事実によって隠されています。 'n'は暗黙的に宣言されていないので、同じ方法で使用することはできません。また同じスコープ内に暗黙的に同じ型の2つの値を宣言すると、コンパイラはあいまいさでエラーを発生させます –

+0

あなたは正しいです。 IDEから間違ったコードをコピーしました。私は答えを更新します。編集:更新されました。 – sebszyller

関連する問題