语法 – Scala中可以忽略哪些字符?
发布时间:2020-12-16 09:44:46 所属栏目:安全 来源:网络整理
导读:在Scala中,为什么我可以省略在T m 0(而不是T.m(0))中的点和制动器? scala object T { def m(i:Int) = 0 == i }defined module Tscala T m 0res19: Boolean = true 但是为什么我不能在下面的n(0)中省略制导? scala def n(i:Int) = 0 == in: (Int)Booleansc
在Scala中,为什么我可以省略在T m 0(而不是T.m(0))中的点和制动器?
scala> object T { def m(i:Int) = 0 == i } defined module T scala> T m 0 res19: Boolean = true 但是为什么我不能在下面的n(0)中省略制导? scala> def n(i:Int) = 0 == i n: (Int)Boolean scala> n 0 <console>:1: error: ';' expected but integer literal found. n 0 ^ 解决方法
前一个例子T m 0是“运算符符号”的例子。 Scala有三种类型的运算符符号,前缀(称为一元),中缀和后缀。我们来看看这三个行动的例子:
class MyByte(val n : Int) { require(n >= 0 && n <= 255) def unary_! = new MyByte(n ^ 0xff) def +(m : MyByte) = new MyByte(n + m.n) def bits = (math.log(n) / math.log(2) + 1).toInt override def toString = "0" * (8 - bits) + n.toBinaryString } 这里正在使用: scala> val a = new MyByte(5) a: MyByte = 00000101 scala> val b = new MyByte(10) b: MyByte = 00001010 scala> ! a // Prefix/Unary res58: MyByte = 22222010 scala> a + b // Infix res59: MyByte = 00001111 scala> b bits // Postfix res60: Int = 4 虽然中缀和后缀符号接受任何有效的Scala标识符,尽管有说明限制后缀符号,只有四个标识符可以用作前缀:?,!, – 和。 现在,当你尝试“m 0”时,Scala把它丢弃为一元运算符,理由是不是一个有效的(?,!, – 和)。它发现“m”是一个有效的对象 – 它是一个函数,而不是一个方法,所有函数都是对象。 由于“0”不是有效的Scala标识符,它不能是中缀和后缀操作符。因此,Scala抱怨说,它预期“ – 将分离两个(几乎)有效的表达式:“m”和“0”。如果你插入它,那么它会抱怨m需要一个参数,或者不这样做,“_”把它变成部分应用的函数。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |