Scala和::对象

我一直在潜入斯卡拉,我绝对喜欢它。 我正忙于模式匹配和案例分类,下面的内容让我有些难堪。 我知道它做了什么,但我想知道到底发生了什么

var list = List(2,3,4)
1::list

如果我对我的理解到目前为止是正确的。 然后::表示一个案例对象。 如果是的话我的问题是:

我如何“将它”留给1? 而不是::作为1的一个方法。基本上,有人可能会将这个语句1 ::列表略微分开,显示实际发生了什么(即,哪些方法被调用什么对象)

谢谢


令人恼火的是,Scala的一些最显着和最棒的功能在表面之下有很多复杂性。 所以,考虑这个简单的线路:

val (head :: tail): ::[Int] = 1 :: Nil

::出现的三个地方中的每一个都指向不同的:: ,以及Scala中的不同机制。 让我们按顺序浏览它们中的每一个。

head :: tail

这里发生的是模式匹配,就像用case语句看到的case 。 模式匹配可以出现在val赋值, <- in的左侧for理解,以及case语句中。

那么,这种特定的模式匹配是如何发生的呢? 那么,每当图案的格式为abc ,斯卡拉将这种成b(a, c)然后将其翻译成呼叫unapplyunapplySeq上的对象b

所以, :: in val (head :: tail)引用object :: :(通过case class定义)。

: ::[Int]

这是一个类型声明,所以::[Int]是一个类型。 ::本身是一个类,也是一个类型构造函数(因为它构造了类型参数 - ::[Int]是一种类型, ::[String]是另一种类型等)。 它也是List的子类,它只有两个子类::Nil的单例类。

这个声明是多余的,并且一般来说,几乎不会使用::作为类型或类。 我在这里展示它主要是为了完整。

1 :: Nil

这里::是一个方法。 它是List一种方法,因此,由于Nil是一个List1不是,它必须属于Nil (或通过隐式转换可用)。

这里说明的机制是方法结尾:在管道符符号,绑定使用权,而不是向左时。 或者,换句话说, a :: b等同于b.::(a)

这种机制很少使用,我猜想,主要是为了使传统的fp列表算法对于用于fp的程序员更为熟悉。 它在Scala标准库的其他一些地方使用,并在其他地方使用。

例如,在Scala 2.8中,现在有+: :,它的作用与::相同,但是为所有Seq定义。 它被反映为:+ ,它追加元素,其:除了从+消除歧义,没有任何其他目的,它被重载以连接字符串。


结束于:的操作员名称绑定到右侧。 :: [A]实际上是List[A]一个case class和一个子类,可以在Scala API参考中看到。 ::也是一个在其正确参数上操作的方法,一个列表,它的左操作数作为参数并返回一个::[A]

所以,在你的榜样,该方法::上调用list1作为参数。 这构造了一个具有参数1list的类型为:: [Int]的对象。


非常快速的答案。 方法::正在以1作为参数列表上调用。

以冒号结尾的任何方法名称(和是,::是一种方法)在右操作数上运行。

链接地址: http://www.djcxy.com/p/12635.html

上一篇: Scala and the :: object

下一篇: Valid identifier characters in Scala