我对Scala编程语言相当新,并且在按照这里的讲座笔记时,遇到了一些困惑。
我认为我并没有真正理解cons运算符的工作原理,下面是我尝试过的一些东西:
我创建了一个伪随机数生成器,然后尝试创建一个包含一个随机值的列表:
scala> val gen = new java.util.Random
gen: java.util.Random = java.util.Random@1b27332
scala> gen nextInt 3 :: Nil
<console>:7: error: type mismatch;
found : List[Int]
required: Int
gen nextInt 3 :: Nil
^
但它试图将 List(3) 传递给 nextnt 方法。当我使用括号时,就没有问题了。
scala> (gen nextInt 3) :: Nil
res69: List[Int] = List(1)
我对执行顺序很好奇,所以我创建了一个函数来检查它。
scala> def pr(i:Int):Int = { println(i); i }
pr: (i: Int)Int
scala> pr(1) :: pr(2) :: pr(3) :: Nil
1
2
3
res71: List[Int] = List(1, 2, 3)
如输出中所示,执行顺序与出现顺序相同。那么我想可能是关于 'nextInt' 函数的问题,然后我尝试了以下操作:
scala> 1 + 2 :: Nil
res72: List[Int] = List(3)
它首先执行了加法,之后才执行cons。那么问题来了:
gen nextInt 3 :: Nil
和1 + 2 :: Nil
有什么区别?
pr(X)
是::
的参数表达式,这些表达式按照出现顺序先进行评估,然后将值传递给方法。pr(1) :: pr(2) :: pr(3) :: Nil
输出 1 2 3。但是,Nil.::(pr(3)).::(pr(2)).::(pr(1))
输出 3 2 1。但是两者都返回了List(1, 2, 3)
。 - michael.kebe