【问题标题】:Using varargs from Scala使用 Scala 中的可变参数
【发布时间】:2010-11-03 18:33:21
【问题描述】:

我正在绞尽脑汁想弄清楚如何做以下事情:

def foo(msf: String, o: Any, os: Any*) = {
    println( String.format(msf, o :: List(os:_*)) )
}

我必须用oos Seq 分别声明方法是有原因的。基本上,我最终得到了使用单个对象参数(List 类型)调用的格式方法。尝试:

def foo(msf: String, o: Any, os: Any*) = {
    println( String.format(msf, (o :: List(os:_*))).toArray )
}

给我类型错误:

找到:数组[任何]

必需的序列[java.lang.Object]

我尝试过强制转换,它编译但失败的原因与第一个示例几乎相同。当我尝试时

println(String.format(msg, (o :: List(os:_*)) :_* ))

由于隐式转换歧义(any2ArrowAssocany2stringadd)而无法编译

【问题讨论】:

    标签: scala variadic-functions


    【解决方案1】:
    def foo(msf: String, o: AnyRef, os: AnyRef*) = 
      println( String.format(msf, (o :: os.toList).toArray : _* ))
    

    【讨论】:

    • 它编译但在运行时崩溃:线程“主”java.lang.ClassCastException 中的异常:scala.$colon$colon 无法在 scala.runtime.RichString 处强制转换为 scala.runtime.BoxedObjectArray。格式(RichString.scala:242)
    • 还有,toList 是从哪里来的?
    • 已修复,现在可以使用。我正在提交一个错误报告——Scala 不应该有 ClassCastExceptions,除非你使用了 asInstanceOf。 toList 是 Iterable[A] 上的一个方法
    • 显然已经在 2.8 分支中修复了 lampsvn.epfl.ch/trac/scala/ticket/1360
    • 为什么需要 toArray 呢?列表是 _* 的有效输入。
    【解决方案2】:
    def foo(msf: String, o: AnyRef, os: AnyRef*) =
      println( String.format(msf, o :: os.toList : _* ) )
    

    def foo(msf: String, o: AnyRef, os: AnyRef*) =
          println( msf format (o :: os.toList : _* ) )
    

    我更喜欢后者,尽管它不支持语言环境*。

    • Scala 2.8 确实支持 RichString 格式的语言环境。

    【讨论】:

    • 使用RichString格式的方式是我最后选择的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 2012-03-21
    • 2011-01-21
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多