在scala中设置函数参数的默认值

在scala中设置函数参数的默认值,scala,lambda,Scala,Lambda,我试图在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 => {

我试图在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
或使用字符串:

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

使用隐式参数。在对象中放置参数的隐式值。除非您提供了显式参数或在调用范围中提供了另一个隐式值,否则将使用此参数

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扩展(使用部分应用程序)来更改默认值

  • 我提供这个解决方案,因为您已经在使用一个对象。否则,Alexvlv的示例更简单。

    其他答案显示了如何提供一些现有的默认值,但如果您希望默认值不做任何事情(如
    case nothing
    所建议的),则可以使用选项/None

     def func2(f:Option[A => B] = None)={
        case Some(f) =>
          //do something....
        case None =>
          //do some other thing......
     }
    
    
     func2()
     func2( Some(_ + 1) )
    

    我想知道这个答案和这个问题有什么关系,它似乎是关于使用curried函数,而不是关于默认参数?好的,明白了。但是我想如果你的例子中有一个非默认情况的例子,你的例子会更有启发性,例如,
    test(*33)(1)
    @GyroGearless谢谢,又添加了一个例子来说明你的func2方法在用法上非常笨拙。获取两个参数列表并返回一个分部函数,因此,如果尝试就地调用result函数,这将不是您所期望的,即调用
    func2(10)
    (第二个分支带有match all
    )将抛出一个错误原因
    func2
    expect是一个隐式参数,您给了它一个int。当隐式(与您的设计相近)是一场灾难并且破坏了很多时,我可以给您大量的生产示例。True。让我自己受到阻碍,试图让他的原始代码保持原样。为理智而编辑。
     def func2(f:Option[A => B] = None)={
        case Some(f) =>
          //do something....
        case None =>
          //do some other thing......
     }
    
    
     func2()
     func2( Some(_ + 1) )