Pergunta

Em Scala, porque posso omitir o ponto e brakets em T m 0 (em vez de T.m(0)) nas seguintes?

scala> object T { def m(i:Int) = 0 == i }
defined module T

scala> T m 0
res19: Boolean = true

Mas por que eu não posso omitir as brakets em n(0) na seguinte?

scala> def n(i:Int) = 0 == i
n: (Int)Boolean

scala> n 0
<console>:1: error: ';' expected but integer literal found.
       n 0
         ^
Foi útil?

Solução

O exemplo anterior, T m 0, é um exemplo de "notação operador". Scala tem três tipos de notações operador, prefixo (chamado unária), infixa e sufixo. Vamos ver exemplos de todos os três em ação aqui:

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
}

Um aqui está em uso:

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

Enquanto infixas e postfix notações aceitar qualquer identificador Scala válida, embora fala-se de restringir a notação postfix, apenas quatro identificadores pode ser usado como prefixo:!. ~, - e +

Agora, quando você tenta "m 0", as devoluções Scala de ser um operador unário, em razão de não ser um válido (~,! - e +). Que considera que "m" é um objeto válido -. É uma função, não um método, e todas as funções são objetos

Como "0" não é um identificador Scala válido, ele não pode ser nem um infixo nem um operador postfix. Portanto, Scala reclama que o esperado ";" - que iria separar dois (quase) expressões válidas: "m" e "0". Se você inseriu-lo, então ele iria reclamar que m requer ou um argumento, ou, na sua falta, um "_" para transformá-lo em uma função parcialmente aplicada.

Outras dicas

Eu acredito que o estilo de sintaxe operador só funciona quando você tem um objeto explícito no lado da mão esquerda. A sintaxe é a intenção de deixá-lo expressar "operando operador operando" operações de estilo de uma forma natural.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top