了解infix方法调用和缺点操作员(::)在Scala中
-
02-10-2019 - |
题
我是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
^
但是它试图将列表(3)传递给NextNT方法。当我使用PARATHES时,没有问题
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)
它首先执行加法,然后执行该缺点。所以这是一个问题: gen nextInt 3 :: Nil
和 1 + 2 :: Nil
?
解决方案
这里有两件事: 优先 和 固定性. 。正如Sepp2k提到的那样,堆栈溢出上的这个问题解释了所引用的优先级,规则不够完整,并且从Scala 2.7到Scala 2.8的更改很小。差异主要涉及运营商结束 =
, , 尽管。
至于 固定性, ,Scala中的几乎所有内容都从左到右读取,这就是程序员所使用的。但是,在Scala中,运营商结束 :
向右读取。
然后以这个示例为例:
1 + 2 :: Nil
首先,优先。最优先的是 +
或者 :
?根据桌子, +
优先考虑 :
, ,因此添加是首先完成的。因此,表达与以下方式相等:
((1).+(2)) :: Nil
现在没有优先冲突,但是 ::
结束 :
, ,它具有不同的固定性。因此,它是右至左阅读的,因此:
Nil.::((1).+(2))
另一方面,在此:
gen nextInt 3 :: Nil
运营商 ::
优先考虑 nextInt
, , 因为 :
优先于所有字母。因此,记住它的固定性,它变成了:
gen nextInt Nil.::(3)
然后变成
gen.nextInt(Nil.::(3))
在这一点上,错误是显而易见的。
PS:我在写 (1).+(2)
代替 1.+(2)
因为,在写作时, 1.
被解释为双重数字,制作 1.+(2)
添加双1.0至2的infix表达式截至Scala 2.10.0,该语法被弃用,并且可能不会在Scala 2.11上存在。
其他提示
这是关于优先级而不是执行命令。 +
比优先级高 ::
, , 所以 a + b :: c
解析 (a + b) :: c
. 。但是,带有常规名称的infix方法呼叫的优先级较低,因此 a foo b c
解析 a foo (b c)
.
看 这个问题 对于按照Scala的优先级订购的运营商列表。