列表 – 在Scala中了解infix方法调用和cons运算符(:)
我对Scala编程语言很新,而在
here的演讲中,我正在尝试一些困扰我心中的东西。
我想我真的不明白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方法。当我使用paratheses,没有问题 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之间的区别是什么? 解决方法
这里有两件值得关注的内容是:
precedence和
fixity.正如sepp2k所提到的,Stack Overflow的这个问题解释了优先级,认为这些规则是不够完整的,Scala 2.7到Scala 2.8之间的变化非常小。差异主要涉及运算符结束于=。
对于固定性,Scala中的几乎所有内容都从左到右读取,这是程序员习惯的。然而,在Scala中,结束于:从右到左读取的操作。 接下来,这个例子: 1 + 2 :: Nil 一,优先。最优先,还是:?根据表格,优先考虑:所以先添加。因此,表达式与此相同: ((1).+(2)) :: Nil 现在没有优先冲突,但是因为::结束于:它有一个不同的固定。从右到左,因此: Nil.::((1).+(2)) 另一方面,在这方面: gen nextInt 3 :: Nil operator ::优先于nextInt,因为:优先于所有字母。因此,记住它的固定性,它变成: gen nextInt Nil.::(3) 然后成为 gen.nextInt(Nil.::(3)) 在这一点上,错误是显而易见的。 PS:我正在写(1)。 (2)而不是1.(2)因为在写作时,1.被解释为双数,使得1.(2)将double 1.0加到2的中缀表达式。 Scala 2.10.0,可能不会出现在Scala 2.11上。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |