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