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

语法 – 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需要一个参数,或者不这样做,“_”把它变成部分应用的函数。

(编辑:李大同)

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

    推荐文章
      热点阅读