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)
然后将其翻译成呼叫unapply
或unapplySeq
上的对象b
。
所以, ::
in val (head :: tail)
引用object ::
:(通过case class
定义)。
: ::[Int]
这是一个类型声明,所以::[Int]
是一个类型。 ::
本身是一个类,也是一个类型构造函数(因为它构造了类型参数 - ::[Int]
是一种类型, ::[String]
是另一种类型等)。 它也是List
的子类,它只有两个子类::
和Nil
的单例类。
这个声明是多余的,并且一般来说,几乎不会使用::
作为类型或类。 我在这里展示它主要是为了完整。
1 :: Nil
这里::
是一个方法。 它是List
一种方法,因此,由于Nil
是一个List
而1
不是,它必须属于Nil
(或通过隐式转换可用)。
这里说明的机制是方法结尾:
在管道符符号,绑定使用权,而不是向左时。 或者,换句话说, a :: b
等同于b.::(a)
。
这种机制很少使用,我猜想,主要是为了使传统的fp列表算法对于用于fp的程序员更为熟悉。 它在Scala标准库的其他一些地方使用,并在其他地方使用。
例如,在Scala 2.8中,现在有+:
:,它的作用与::
相同,但是为所有Seq
定义。 它被反映为:+
,它追加元素,其:
除了从+
消除歧义,没有任何其他目的,它被重载以连接字符串。
结束于:
的操作员名称绑定到右侧。 :: [A]
实际上是List[A]
一个case class
和一个子类,可以在Scala API参考中看到。 ::
也是一个在其正确参数上操作的方法,一个列表,它的左操作数作为参数并返回一个::[A]
。
所以,在你的榜样,该方法::
上调用list
用1
作为参数。 这构造了一个具有参数1
和list
的类型为:: [Int]
的对象。
非常快速的答案。 方法::正在以1作为参数列表上调用。
以冒号结尾的任何方法名称(和是,::是一种方法)在右操作数上运行。
链接地址: http://www.djcxy.com/p/12635.html