加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

列表 – 在Scala中了解infix方法调用和cons运算符(:)

发布时间:2020-12-16 09:34:00 所属栏目:安全 来源:网络整理
导读:我对Scala编程语言很新,而在 here的演讲中,我正在尝试一些困扰我心中的东西。 我想我真的不明白cons操作者的工作原理,这里有一些我试过的东西: 我创建了一个伪随机数生成器,然后尝试创建一个随机值的列表: scala val gen = new java.util.Randomgen: j
我对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上。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读