14

デフォルト値をscalaの無名関数に設定しようとしているため、解決策が見つかりません。SOで誰かが私を助けてくれることを願っています。

私は次の構造を持っています、

case class A(id:Int = 0)

case class B(a:A)

object B {
     def func1(f:Int = 0)={
      ........
     }
 def func2(f:A => B = (how to give default value ?))={
        case Nothing => {
         //do something....
        }
        case _ => {
         //do some other thing......
        }
 }
} 

基本的に、パラメータの受け渡しは任意にしたいです。どうすればこれを達成できますか?

4

3 に答える 3

16

他のデフォルト パラメータと同様に、次のように指定します。

scala> def test(f: Int => Int = _ + 1) = f
test: (f: Int => Int)Int => Int

scala> test()(1)
res3: Int = 2

または文字列で:

scala> def test(f: String => String = identity) = f
test: (f: String => String)String => String

scala> test()
res1: String => String = <function1>

scala> test()("Hello")
res2: String = Hello

編集:

デフォルトで提供されている関数を使用する場合は、()明示的に使用する必要があります。Scala はデフォルトの引数を貼り付けません。

デフォルトの関数を使用せずに明示的な関数を提供する場合は、自分で提供してください。

scala> test(_.toUpperCase)("Hello")
res2: String = HELLO
于 2013-09-30T09:04:51.127 に答える
1

暗黙的なパラメーターを使用します。パラメータの暗黙的な値をオブジェクトに配置します。これは、明示的なパラメーターを提供するか、呼び出しスコープで別の暗黙的な値を提供しない限り使用されます。

case class A(id:Int = 0)

case class B(a:A)

object B {
  implicit val defFunc: A => B = {a: A =>  new B(a) }
  def func1(f:Int = 0)={
  }
  def func2(implicit func: A => B) = { ... }
} 

この方法と Alexlv の方法の違いは次のとおりです。

  1. これは、メソッドだけでなくスタンドアロン関数でも機能します。
  2. スコープ ルールにより、適切なスコープで適切なオーバーライドを提供できます。Alex の方法では、デフォルトを変更するためにサブクラス化または eta 拡張 (部分的な適用を伴う) が必要になります。

すでにオブジェクトを使用しているため、このソリューションを提供します。それ以外の場合は、Alexvlv の例の方が簡単です。

于 2013-09-30T11:37:36.397 に答える