我一直潜入scala,到目前为止我非常喜欢它.我正在开始模式匹配和案例类,以下让我有点难过.我知道它的作用,但我想知道究竟发生了什么
var list = List(2,3,4)
1::list
Run Code Online (Sandbox Code Playgroud)
如果到目前为止我的理解是正确的.然后::表示一个案例对象.如果是这样,我的问题是:
我怎么"把它"应用到1?而不是::是一个方法1.基本上可以有人拉这个语句1 ::列表分开,显示真正发生的事情(即什么方法被调用什么对象)
谢谢
Dan*_*ral 18
令人讨厌的是,Scala的一些最明显和最令人敬畏的功能在表面下方具有如此多的复杂性.所以,考虑这个简单的界限:
val (head :: tail): ::[Int] = 1 :: Nil
Run Code Online (Sandbox Code Playgroud)
::出现的三个地方中的每一个都指向::Scala中的不同机制和不同机制.让我们按顺序浏览每一个.
head :: tail这里发生的是模式匹配,就像人们看到case语句一样.模式匹配可以出现在val赋值中,<-在for理解的左侧和case语句上.
那么,这种特殊的模式匹配是如何发生的呢?好吧,每当模式采用格式时a b c,Scala会将其转换为b(a, c),然后将其转换为对象unapply或unapplySeq对象的调用b.
所以,::in val (head :: tail)指的是对象::(通过a定义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.它被镜像:+,它附加元素,:除了消除歧义之外没有任何目的+,它被重载到连接字符串.
Fre*_*Foo 10
以结尾的运算符名称:绑定到右侧.:: [A]实际上是一个case class和子类List[A],在Scala API参考中可以看到.::也是一个操作其右边参数的方法,一个列表,将其左操作数作为参数并返回一个::[A].
所以,在你的榜样,该方法::被称为上list与1作为参数.这构造了一个:: [Int]带有参数1和类型的对象list.
| 归档时间: |
|
| 查看次数: |
968 次 |
| 最近记录: |