def foo( f: => String) = println(f) foo: (f: => String)Unit 我可以: scala> def foo( f: Stri-6ren">
gpt4 book ai didi

scala - 参数列表 ("*")带有惰性 "by-name"参数?

转载 作者:行者123 更新时间:2023-12-03 03:46:51 25 4
gpt4 key购买 nike

我可以:

scala> def foo( f: => String) = println(f)
foo: (f: => String)Unit

我可以:

scala> def foo( f: String*) = f.map(println)
foo: (f: String*)Seq[Unit]

但我不能:

scala> def foo( f: =>String* ) = f.map(println)
<console>:1: error: ')' expected but identifier found.
def foo( f: =>String* ) = f.map(println)
^

也不

scala> def foo( f: (=>String)* ) = f.map(println)
<console>:1: error: no by-name parameter type allowed here
def foo( f: (=>String)* ) = f.map(println)
^

还有其他方法可以实现我想要的功能吗?为什么不允许这样做?

最佳答案

这里的=>表示参数是按名称传递的。您所尝试的操作是不允许的,因为 =>String 不是实际类型(与 ()=>String 相反),并且您无法创建 数组[=>字符串]。假定可变参数 x: T* 在底层被处理为包含所有参数值的数组(如 x: Array[T] 中所示),这就是无法创建 Array[=>String] (这没有意义)的原因也意味着可变参数 f: (=>String)* 是不可能。

可以使用一个小包装类来解决这个问题:

implicit class ByName[T]( getValue: => T ) extends Proxy {
def apply(): T = getValue
def self = apply()
}

然后更改方法的签名,如下所示:

def foo( fs: ByName[String]* )

当使用多个参数调用方法时,所有参数将隐式包装到 ByName 实例中,然后您可以调用 apply 来获取实际值:

def foo( fs: ByName[String]* ) = fs foreach { f => println( f() ) }

鉴于 ByName 扩展了 Proxy 来实现简单的事情,例如调用 toString 或测试相等性,您甚至不必调用 应用。因此,您可以简单地执行以下操作:

def foo( fs: ByName[String]* ) = f foreach println

关于scala - 参数列表 ("*")带有惰性 "by-name"参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16319796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com