Scala命名参数和默认参数以及隐式参数
考虑以下几点:Scala命名参数和默认参数以及隐式参数,scala,default-value,named-parameters,implicits,Scala,Default Value,Named Parameters,Implicits,考虑以下几点: def f(implicit a: String, y: Int = 0) = a + ": " + y implicit val s = "size" println(f(y = 2)) 最后一个表达式导致以下错误: not enough arguments for method f: (implicit a: String, implicit y: Int)java.lang.String. Unspecified value parameter a. 但是,如果为隐式参
def f(implicit a: String, y: Int = 0) = a + ": " + y
implicit val s = "size"
println(f(y = 2))
最后一个表达式导致以下错误:
not enough arguments for method f: (implicit a: String, implicit y:
Int)java.lang.String. Unspecified value parameter a.
但是,如果为隐式参数a提供默认值,则没有问题:
def f(implicit a: String = "haha!", y: Int = 0) = a + ": " + y
implicit val s = "size"
println(f(y = 2))
但最后一行是打印的
haha!: 2
而我本以为
size: 2
因此,不会拾取隐式值“s”。如果您没有向f提供任何参数,只需调用
println(f)
然后取隐式值,得到
size: 0
有人能解释一下这里发生了什么吗?试试看
println(f(y = 2, a = implicitly))
一旦开始指定参数,就无法返回。要么整个列表都是隐式的,要么一个都不是。按照jsuereth所说的,您可以将函数定义为
def f(a: String = implicitly, y:Int = 0) = a + ": " + y
或者以我更习惯于看到的方式
def f(y:Int = 0)(implicit a: String) = a + ": " + y
隐式参数应该分开使用——首先,在方法定义的末尾——其次。像这样:
def f(y: Int = 0)(implicit a: String) = a + ": " + y
implicit val s = "size"
println(f(y = 2))
输出
size: 2
您应该检查隐式使用的是哪个隐式范围。我认为这与第二个选项不同。要使用第一个默认参数,必须调用
f()
。