Capire la sintassi di Scala speciale

3

Posso capire questo:

List("one word", "another word") unzip (_ span (_ != ' '))

Ma non capisci cosa sta succedendo qui sotto nella span . span prende un predicato e penso che le parentesi possono essere omesse poiché span è usato in linea e ha solo un parametro ma perché non c'è alcun _ e cos'è ' '.!=

List("one word", "another word") unzip (_ span ' '.!=)
    
posta user116948 03.02.2014 - 23:25
fonte

1 risposta

4

In Scala, gli operatori sono solo metodi con nomi speciali. Qui ' '.!= recupera ma non applica != all'oggetto ' ' . Questo metodo accetta un parametro e restituisce un valore booleano.

Per qualsiasi funzione f che richiede un singolo argomento, (x => f(x)) e f sono espressioni equivalenti - quindi non è necessario racchiudere una funzione di questo tipo in un'altra lambda.

Il metodo span prende un predicato e divide una sequenza (qui: String) in un prefisso che soddisfa il predicato e un suffisso che non lo fa. Qui vogliamo ottenere la stringa fino al primo spazio.

  • Nella prima riga, usiamo il predicato (_ != ' ') , più chiaramente (c => c != ' ') .
  • Ora possiamo scambiare gli argomenti della disuguaglianza "operatore", poiché questa operazione dovrebbe essere riflessiva. Ora abbiamo: (c => ' ' != c) .
  • Ora possiamo utilizzare la sintassi di chiamata del metodo esplicito: (c => ' '.!=(c)) .
  • Successivamente, salviamo il metodo in un'altra variabile:

    val f: (Char => Boolean) = ' '.!=
    ...
    (c => f(c))
    
  • Come detto sopra, f e (c => f(c)) sono equivalenti, quindi (_ != ' ') e ' '.!= devono essere uguali.

risposta data 03.02.2014 - 23:48
fonte

Leggi altre domande sui tag