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

有人知道如果这样的事情可能在Scala:

case class Thing(property:String)

def f(thing:Thing, prop:String = thing.property) = println(prop)

上面的代码不编译;给出错误错误:没有找到:value thing在thing.property

以下显示预期的行为:

f(Thing("abc"), "123") // prints "123"
f(Thing("abc"))        // prints "abc"

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

是的,可以在Scala 2.8中.这是“Named and Default Arguments in Scala 2.8”设计文件的引用:

Since the scope of a parameter extends
over all subsequent parameter lists
(and the method body), default
expressions can depend on parameters
of preceding parameter lists (but not
on other parameters in the same
parameter list). Note that when using
a default value which depends on
earlier parameters, the actual
arguments are used, not the default
arguments.

def f(a: Int = 0)(b: Int = a + 1) = b // OK

又如:

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

据此,您的代码可能如下所示:

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
http://stackoverflow.com/questions/3090753/is-it-possible-for-an-optional-argument-value-to-depend-on-another-argument-in-s

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:可选参数值是否可以依赖于Scala中的另一个参数