【问题标题】:Which characters can I omit in Scala?我可以在 Scala 中省略哪些字符?
【发布时间】:2009-06-17 13:19:53
【问题描述】:

在 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
         ^

【问题讨论】:

    标签: syntax scala


    【解决方案1】:

    前面的例子,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 = 11111010
    
    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 需要一个参数,或者,如果没有,一个“_”将它变成一个部分应用的函数。

    【讨论】:

    • 不列表使用 ::: 和 :: 作为前缀表示法?
    • @asperous.us 否。以: 结尾的运算符有不同的fixity:它们是右结合而不是左结合 , 但它们都是中缀运算符。
    【解决方案2】:

    我相信运算符语法风格只有在左侧有一个明确的对象时才有效。该语法旨在让您以自然的方式表达“操作数运算符操作数”样式的操作。

    【讨论】:

    • 我不知道你所说的显式对象是什么意思,但你可以在你的左侧拥有几乎任何评估为对象的东西,对吧? (……左?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多