可选参数值是否可能依赖于Scala中的另一个参数

Kri*_*ala 17 scala default-value named-parameters scala-2.8

有没有人知道Scala中是否有类似的东西:

case class Thing(property:String)

def f(thing:Thing, prop:String = thing.property) = println(prop)
Run Code Online (Sandbox Code Playgroud)

上面的代码没有编译; 给错误error: not found: value thingthing.property

以下显示了预期的行为:

f(Thing("abc"), "123") // prints "123"
f(Thing("abc"))        // prints "abc"
Run Code Online (Sandbox Code Playgroud)

我意识到我可以使prop参数成为一个Option[String]并在函数定义中进行检查,但我想知道是否有一种方法可以使用2.8.0中的新命名/默认参数支持.

Vas*_*iuk 20

是的,它可以在Scala 2.8中使用.以下是"Scala 2.8中的命名和默认参数"设计文档中的引用:

由于参数的范围扩展到所有后续参数列表(和方法体),因此默认表达式可以取决于前面参数列表的参数(但不取决于同一参数列表中的其他参数).请注意,使用依赖于先前参数的默认值时,将使用实际参数,而不是默认参数.

def f(a: Int = 0)(b: Int = a + 1) = b // OK
Run Code Online (Sandbox Code Playgroud)

另一个例子:

def f[T](a: Int = 1)(b: T = a + 1)(c: T = b)
// generates:
// def f$default$1[T]: Int = 1
// def f$default$2[T](a: Int): Int = a + 1
// def f$default$3[T](a: Int)(b: T): T = b
Run Code Online (Sandbox Code Playgroud)

根据这个,您的代码可能如下所示:

scala> case class Thing(property:String)
defined class Thing

scala> def f(thing:Thing)(prop:String = thing.property) = println(prop)
f: (thing: Thing)(prop: String)Unit

scala> f(Thing("abc"))("123")
123

scala> f(Thing("abc"))()
abc
Run Code Online (Sandbox Code Playgroud)