2011-08-24 2 views

risposta

9

Tutti mutabili collezioni in Scala hanno il BufferLike trait e definisce un metodo append.

immutabili collezioni non hanno il tratto BufferLike e quindi definire solo gli altri metodi che non cambiano la raccolta sul posto ma generarne uno nuovo.

+1

Sì, ma perché? Posso vivere con un Seq che restituisce un nuovo Seq dopo 'append'. Perché non aggiungere tali alias, almeno per semplificare l'interoperabilità java. – F0RR

+4

Semantica, append in Java viene utilizzata per varie classi di buffer, come StringBuffer e StringBuilder, quando si utilizza append si aspetta che si aggiunga all'oggetto corrente, non si crei un nuovo oggetto. Definendo un metodo di aggiunta che crea un nuovo oggetto, si rompe questa aspettativa, il che non è affatto piacevole. –

3

Infatti spesso alcuni sinonimi leggibili:

  • foldLeft equivale a /:
  • foldRight è equivalente a :\

i restanti siano operatori di addizione, che sono abbastanza umana leggibili così come sono:

  • ++ è equivalente a java addAll
  • :+ è accoda
  • +: è fallo precedere

La posizione della virgola indica l'istanza ricevitore.

Infine, alcuni operatori strani sono eredità di altri linguaggi di programmazione funzionale. Come la costruzione di liste (SML) o la messaggistica degli attori (erlang).

+0

Non sono sicuro che ': +' e 'append' siano gli stessi. Penso che il primo (da 'SeqLike') crea una nuova raccolta mentre il secondo (da' BufferLike') modifica il buffer in atto. –

+0

Sì, hanno una semantica diversa in Scala, ma è comunque un'operazione "aggiunta". – paradigmatic

4

nomi dei metodi simbolici consentono la combinazione con l'operazione di assegnazione =.

Per esempio, se si dispone di un metodo ++ che crea una nuova collezione, è possibile utilizzare automaticamente ++= per assegnare la nuova collezione di alcune variabili:

var array = Array(1,2,3) 
array ++= Array(4,5,6) 
// array is now Array(1,2,3,4,5,6) 

Questo non è possibile senza i nomi dei metodi simbolici.

0

La libreria standard di Scala non è compatibile con Java. Invece, gli adattatori sono forniti per la conversione tra le raccolte Java e Scala.

tentativo di fornire un'API Java amichevole sarebbe non solo limitare la scelta degli identificatori (o mandato che dovrebbero essere forniti pseudonimi), ma anche limitare il modo che i generici e tipi di funzione sono stati utilizzati. Sostanzialmente sarebbero necessari più test per convalidare il design.

Sullo stesso argomento, mi ricordo un certo dibattito sul fatto che i 2,8 collezioni dovrebbero attuare java.util.Iterable.

http://scala-programming-language.1934581.n4.nabble.com/How-to-set-the-scale-for-scala-BigDecimal-s-method-td1948885.html

http://www.scala-lang.org/node/2177

2

E 'diverso rispetto a qualsiasi altra lingua?

Prendiamo Java. Qual è la versione leggibile dall'uomo di +, -, * e / su int? Oppure prendiamo il codice String: qual è la versione leggibile dall'uomo di +? Notare che concat non è la stessa cosa: non accetta i parametri non String.

Forse siete infastiditi da essa perché in Java - a differenza, ad esempio, C++ - o cose utilizzare esclusivamente gli operatori non alfabetici, o operatori alfabetici - con l'eccezione di String s' +.