我试图在scala中为匿名函数设置默认值,因此无法找到任何解决方案。希望有人能帮助我。
我有以下结构,
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......
}
}
}
基本上,我想将参数作为可选参数传递。我怎样才能做到这一点?
像任何其他默认参数一样:
scala> def test(f: Int => Int = _ + 1) = f
test: (f: Int => Int)Int => Int
scala> test()(1)
res3: Int = 2
或者使用String:
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
像任何其他默认参数一样:
scala> def test(f: Int => Int = _ + 1) = f
test: (f: Int => Int)Int => Int
scala> test()(1)
res3: Int = 2
或者使用String:
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
使用隐式参数。在参数中放置参数的隐式值。除非您提供显式参数或在调用范围中提供了另一个隐式值,否则将使用此方法。
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方法的区别在于
- 这适用于独立函数和方法。
- 范围规则允许在适当的范围内提供适当的覆盖。 Alex的方法需要子类化或eta-expansion(使用部分应用程序)来更改默认值。
我提供此解决方案,因为您已经在使用对象。否则,Alexvlv的例子就更简单了。