Notazione infix Scala

9

È possibile chiamare un metodo usando la notazione infisso?

Ad esempio, in Haskell, potrei scrivere la seguente spiegazione:

x 'isAFactorOf' y = x % y == 0

e quindi usarlo come:

if 2 'isAFactorOf' 10 ...

Che in alcuni casi consente un codice molto leggibile. C'è qualcosa di simile a questo possibile in Scala? Ho cercato "Scala infix notation", ma quel termine sembra significare qualcosa di diverso in Scala.

    
posta Carcigenicate 05.12.2014 - 14:41
fonte

2 risposte

12

Per espandere la risposta di @eques, a partire dalla versione 2.10, Scala ha introdotto le classi implicite per gestire con precisione questo problema.

Questo eseguirà una conversione implicita su un determinato tipo in una classe spostata, che può contenere i tuoi metodi e valori.

Nel tuo caso specifico, dovresti usare qualcosa del genere:

implicit class RichInt(x: Int) {
  def isAFactorOf(y: Int) = x % y == 0
}

2.isAFactorOf(10)
// or, without dot-syntax
2 isAFactorOf 10

Nota che quando compilato, questo finirà per inscatolare il nostro valore grezzo in RichInt(2) . Puoi aggirare questo dichiarando il tuo RichInt come sottoclasse di AnyVal :

implicit class RichInt(val x: Int) extends AnyVal { ... }

Questo non causa il pugilato, ma è più restrittivo di una tipica classe implicita. Può solo contenere metodi, non valori o stato.

    
risposta data 05.12.2014 - 15:02
fonte
3

Essenzialmente, in Scala non è possibile chiamare una funzione in modo infisso, ma è possibile definire un metodo su un tipo, che può essere convertito in modo implicito nell'argomento sinistro. Quindi per il tuo esempio, puoi definire una classe che ha un metodo isAFactorOf (prendendo un Int) e indicare che un Int può essere convertito implicitamente in un'istanza di questa classe.

Se guardi questa risposta link ad un'altra domanda, vedrai la sintassi in Scala che funziona in modo equivalente.

    
risposta data 05.12.2014 - 14:50
fonte

Leggi altre domande sui tag