Pregunta

En Scala, ¿por qué puedo omitir el punto y los corchetes en T m 0 (en lugar de T.m (0) ) en lo siguiente?

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

scala> T m 0
res19: Boolean = true

¿Pero por qué no puedo omitir los corchetes en n (0) en lo siguiente?

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

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

Solución

El ejemplo anterior, T m 0, es un ejemplo de "notación de operador". Scala tiene tres tipos de anotaciones de operador, prefijo (llamado unario), infijo y postfix. Veamos ejemplos de los tres en acción aquí:

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
}

Aquí está en 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

Si bien las anotaciones infijo y postfix aceptan cualquier identificador Scala válido, aunque se habla de restringir la notación postfix, solo se pueden usar cuatro identificadores como prefijo: ~,!, - y +.

Ahora, cuando intente " m 0 " ;, Scala descarta que sea un operador unario, por no ser válido (~,!, - y +). Encuentra que '' m '' es un objeto válido: es una función, no un método, y todas las funciones son objetos.

Como " 0 " no es un identificador Scala válido, no puede ser ni un operador infijo ni postfix. Por lo tanto, Scala se queja de que esperaba " ;; " - que separaría dos (casi) expresiones válidas: "m" y '' 0 ''. Si lo inserta, se quejará de que m requiere un argumento o, en su defecto, un " _ " para convertirlo en una función parcialmente aplicada.

Otros consejos

Creo que el estilo de sintaxis del operador solo funciona cuando tienes un objeto explícito en el lado izquierdo. La sintaxis está pensada para permitirle expresar "operador operando operando" operaciones de estilo de forma natural.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top