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()