微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Scala数组与向量

如何解决Scala数组与向量

| Scala newb ...我很困惑
object myApp extends App {
  println(\"Echo\" + (args mkString \" \"))
}
\“ args \”的类型为Array [String],但是在scaladoc中,Array没有这种方法。 mkString是Vector的一种方法,但我看不到两者之间的任何继承链接。那么为什么我们可以在args上使用mkString方法呢?     

解决方法

我不是Scala专家(距离它还远!),但我认为答案是隐式转换(请参阅
scala.Predef
)和WrappedArray.scala。 特别是,Predef具有以下隐式转换:
implicit def genericWrapArray [T] (xs: Array[T]): WrappedArray[T] 
WrappedArray有一个mkString方法。当Scala在Array上找不到mkString方法时,它会寻找隐式转换为可以的类型。 http://www.scala-lang.org/api/current/scala/Predef$.html http://www.scala-lang.org/api/current/scala/collection/mutable/WrappedArray.html     ,扩展Kevin的答案,并解释为什么scaladoc不可能告诉您存在什么隐式转换:隐式转换仅在您的代码无法以其他方式编译时起作用。 您可以将其视为在编译期间激活的类型错误的错误恢复机制。在这种情况下,
Array[String]
没有have4ѭ方法。该代码无法编译,因为该方法在ѭ5上不存在。但是在放弃之前,编译器将在范围内寻找隐式转换。 碰巧“ 6”会带来许多范围内的隐式转换,并且将在此处应用。 可以通过使用
-Xprint:typer
标志进行编译来找出适用于哪些隐式转换。在这种情况下,它将打印:
$ scalac -d classes -Xprint:typer A.scala
[[syntax trees at end of typer]]// Scala source: A.scala
package <empty> {
  final object myApp extends java.lang.Object with App with ScalaObject {
    def this(): object myApp = {
      myApp.super.this();
      ()
    };
    scala.this.Predef.println(\"Echo \".+(scala.this.Predef.refArrayOps[String](myApp.this.args).mkString(\" \")))
  }
}
因此,您可以看到ѭ9实际上是所使用的隐式转换。它将数组转换为into10ѭ,它具有
mkString
方法。 因此,牢记这一点,您会明白为什么ala12ѭ的scaladoc无法告诉您可以应用什么隐式转换。可能是任何东西。实际上,这完全基于没有这种方法的事实。只有编译器才知道根据代码发现的隐式内容。 您甚至可以定义自己的隐式转换:
object myApp extends App {
  implicit def myImplicit(arr:Array[String]) = new {
    def mkString(s:String) = arr.length + s
  }
  println(\"Echo \" + (args mkString(\" \")))
}
这将具有以下效果:
$ scala -cp classes myApp a b c
Echo 3
显然scaladoc将无法显示该内容。请注意,Eclipse Scala插件可以通过按F3键将您带到
mkString
的实现(您将以
TraversableOnce
结尾)。     ,但是Scaladoc至少可以说Predef(这很特别,因为它始终在作用域内)具有Array的隐式转换。那会很有用。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。