Установить значение по умолчанию для параметра функции в 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 являются
- это работает с автономными функциями, а также методов.
- правила области позволяют предоставлять соответствующие переопределения в соответствующих областях. Алекс метод потребует подклассов или eta-расширения (с частичным применением) для изменения значения по умолчанию.
Я предлагаю такое решение, так как вы уже используете объект. В противном случае пример Alexvlv проще.
