你知道那个场景在再见和感谢所有鱼在亚瑟是如此神志不清的快乐他停止服务员并要求知道,"为什么这样的食物这么好?" 我处于那种情况.Scala似乎正在做我想要的,但我不明白它是如何做到的.考虑以下:
scala> var v = Nil:List[String];
v: List[String] = List()
scala> v.length
res38: Int = 0
scala> v ::= "Hello"
scala> v.length
res39: Int = 1
scala> Nil.length
res40: Int = 0
Run Code Online (Sandbox Code Playgroud)
这正是你所希望的,但它是如何发生的?
Nil是一个扩展List [Nothing]的对象,它是List [String]的子类型,所以赋值工作正常,但它是一个不可变列表,不是吗?所以我不应该追加它.但是我可以附加它,或者至少我可以附加到v,我认为它指向Nil.v被改变了,但是Nil不是.
那么,WTF?Scala是否有一些我不知道的聪明的复制修改语义?Nil真的是一个返回空列表的函数吗?更广泛地说,有什么方法可以让REPL回答这些问题吗?
Dan*_*ral 16
当斯卡拉看到
v ::= "Hello"
Run Code Online (Sandbox Code Playgroud)
它首先检查是否v知道方法::=.在这种情况下(类型List),但它没有,所以,因为该方法只包括符号和与结束=的标志,它会尝试别的东西:
v = v.::("Hello")
Run Code Online (Sandbox Code Playgroud)
顺便"Hello" :: v提一下,这是用中缀符号写的.现在,既然v知道了方法::,它就可以工作并返回一个新的List,然后v按指示分配给它.
顺便说一句,它是前置,而不是附加.
| 归档时间: |
|
| 查看次数: |
457 次 |
| 最近记录: |