Scala和:: object
我一直潜入
scala,到目前为止我非常喜欢它.我正在开始模式匹配和案例类,以下让我有点难过.我知道它的作用,但我想知道究竟发生了什么
var list = List(2,3,4) 1::list 如果到目前为止我的理解是正确的.然后::表示一个案例对象.如果是这样,我的问题是: 我怎么“把它”应用到1?而不是::是一个方法1.基本上可以有人拉这个语句1 ::列表分开,显示真正发生的事情(即什么方法被调用什么对象) 谢谢 解决方法
令人讨厌的是,Scala的一些最明显和最令人敬畏的功能在表面下方具有如此多的复杂性.所以,考虑这个简单的界限:
val (head :: tail): ::[Int] = 1 :: Nil ::ex出现的三个地方中的每一个都引用了不同的::,以及Scala中的不同机制.让我们按顺序浏览每一个. 头::尾巴 这里发生的是模式匹配,就像用case语句看到的一样.模式匹配可以出现在val赋值,左边的< - in for comprehensions和case语句中. 那么,这种特殊的模式匹配是如何发生的呢?好吧,只要模式的格式为b b,Scala就会将其转换为b(a,c),然后将其转换为对象b上的unapply或unapplySeq调用. 所以,:: in val(head :: tail)是指对象::(通过case类定义). :: :: [Int] 这是一个类型声明,因此:: [Int]是一个类型. ::本身是一个类,也是一个类型构造函数(因为它构造给定类型参数的类型 – :: [Int]是一种类型,:: [String]是另一种类型,等等).它也是List的子类,它只有两个子类:::和Nil的单例类. 这个声明是多余的,一般来说,一个人几乎不会使用::作为一个类型或类.我在这里展示它主要是为了完整性. 1 ::无 这里,::是一种方法.它是List的一种方法,因此,由于Nil是List而1不是,它必须属于Nil(或通过隐式转换可用). 这里注意的机制是以下结尾的方法:当在中缀运算符表示法中使用时,绑定到右边而不是左边.或者,换句话说,a :: b相当于b.::(a). 很少使用这种机制,我怀疑,主要是为了使传统的fp列表算法对于习惯于fp的程序员来说更为熟悉.它在Scala标准库的其他一些地方使用,并在其中使用. 例如,在Scala 2.8上,现在有:,它与::的目的相同,但是为所有Seq定义.它由以下内容镜像:,它附加元素,并且除了消除歧义之外没有任何其他目的,它被重载以连接字符串. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |