2017-05-12 14 views
0

メソッドは暗黙的なパラメータを引数として持つことはできませんか? 私のコードでは、暗黙的なパラメータを持つメソッドを作成します。いくつかの時間私はちょうど他の方法に転送したい。このときScalaは私にエラーを与えます。以下を参照してください:スカラ暗黙的なパラメータを持つメソッドを参照する方法

case class ComplicatedSalesTaxData(baseRate: Float,isTaxHoliday: Boolean) 
def calcText(amount: Float,rate : (ComplicatedSalesTaxData) => Float) : Float = amount * rate(ComplicatedSalesTaxData(0.06F,false)) 
def rate(implicit cstd:ComplicatedSalesTaxData) = { 
if(cstd.isTaxHoliday) 
    cstd.baseRate 
else 
    0.01F } 

calcText(100F,rate) // will get error : could not find implicit value for parameter cstd: ComplicatedSalesTaxData 
+0

ここで、「ComplicatedSalesTaxData」の「暗黙の」インスタンスはどこですか? –

+0

私はそれを宣言しますが、ここでは宣言しません。ここでは、私はちょうど 'レート'メソッドを 'calcText'に転送し、 'calcText'で作成した 'ComplicatedSalesTaxData'を指定して呼び出したい – Milk

答えて

2

あなたは明示的にパラメータを渡すことを言っている:

calcText(100F,rate(_)) 
+0

ありがとうございますが、この場合 "レート(_)"は匿名メソッドであり、参照 。 – Milk

+0

実際には匿名**機能**です。明示的なパラメータで 'rate'を定義した場合、' rate'を 'calcText'にパラメータとして渡すと' rate'メソッドへの参照は渡されません(メソッドはオブジェクトではなく、参照もありません)。このメソッドによって定義される 'Function1'オブジェクトです。だから、基本的にはすべて同じことになる。ここでの違いは、パラメータが与えられていない場合、 'rate'は、関数とみなされるのではなく、スコープ内の暗黙的なものに適用されると仮定されることです。 –

+0

はい、私はそれを得る。どうもありがとうございました。 – Milk

0

あなたが投稿したエラーメッセージは、コンパイラが現在のスコープに暗黙のComplicatedSalesTaxDataを見つけることができないと言います。したがって、あなたは1つを定義しなければなりません。 次に、ワイルドカード_の代わりにこのコールがcalcText(100F,rate(_))のように表示され、値を明示的に渡すこともできます。

関連する問題