我正在尝试分析以下Scala代码:
import java.nio.file._
import scala.Some
abstract class MyCustomDirectoryIterator[T](path:Path,someNumber:Int, anotherNum:Int) extends Iterator[T] {
def getCustomIterator(myPath:Path):Option[(DirectoryStream[Path],
Iterator[Path])] = try {
//we get the directory stream
val str = Files.newDirectoryStream(myPath)
//then we get the iterator out of the stream
val iter = str.iterator()
Some((str -> iter))
} catch {
case de:DirectoryIteratorException =>
printstacktrace(de.getMessage)
None
}
我如何插入这段代码:Some((str -> iter))
是的,它返回的值为:
Option[(DirectoryStream[Path], Iterator[Path])]
- >从我的理解来看,运算符是来自scala.Predef包的ArrowAssoc。
implicit final class ArrowAssoc[A] extends AnyVal
但我仍然不明白 - >事情是给我一个类型的返回值:
Option[(DirectoryStream[Path], Iterator[Path])]
这里的Scala专家能否更多地了解这一点?有没有办法以更易读的方式编写“Some(..)”的东西?不过,我确实理解了Some扮演的角色。
答案 0 :(得分:8)
->
运算符只创建一个元组:
scala> 1 -> "one"
res0: (Int, String) = (1,one)
相当于
scala> (1, "one")
res1: (Int, String) = (1,one)
我只是要添加源代码,但Reactormonk首先到达那里;-)
->
方法通过隐式ArrowAssoc类在任何对象上可用。在A
类型的对象上调用它,传递B
类型的参数,会创建Tuple2[A, B]
。
答案 1 :(得分:8)
->
运算符的常见情况是
Map(1 -> "foo", 2 -> "bar")
与
相同Map((1, "foo"), (2, "bar"))
哪个有效,因为Map.apply
的签名是
def apply[A, B](elems: Tuple2[A, B]*): Map[A, B]
这意味着它将元组作为参数并从中构造Map
它
所以
(1 -> "foo")
相当于
(1, "foo")
来自编译器来源:
implicit final class ArrowAssoc[A](private val self: A) extends AnyVal {
@inline def -> [B](y: B): Tuple2[A, B] = Tuple2(self, y)
def →[B](y: B): Tuple2[A, B] = ->(y)
}
直接告诉你它创建了一个元组。那1 → "foo"
也可以。