Установить значение по умолчанию для параметра функции в Scala

Я пытаюсь установить значение по умолчанию для анонимной функции в 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......
        }
 }
} 

в принципе, я хочу сделать передачу параметра необязательной. Как я могу достичь этого?

2 ответов


как и любой другой параметр по умолчанию:

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

Edit:

если вы хотите использовать функцию, предоставленную по умолчанию, вы должны использовать () явно, либо 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 являются

  1. это работает с автономными функциями, а также методов.
  2. правила области позволяют предоставлять соответствующие переопределения в соответствующих областях. Алекс метод потребует подклассов или eta-расширения (с частичным применением) для изменения значения по умолчанию.

Я предлагаю такое решение, так как вы уже используете объект. В противном случае пример Alexvlv проще.