2015-03-01 6 views
5

Ho letto il walkthrough about sequences ma non capisco veramente perché c'è un modo per definire sia una sequenza letterale iterabile che una letterale.Perché dovresti creare un Iterable invece di una Sequence a Ceylon?

{String+} iterable = {"String1", "String2"}; 
[String+] sequence = ["String1", "String2"]; 

Dal sequenza è un sottotipo di Iterable, sembra che dovrebbe essere in grado di fare tutto l'Iterable fa e più.

Qual è la necessità di avere l'inizializzatore di parentesi graffe Iterable quindi? Quando vorresti usarlo al posto della versione Sequence della parentesi quadra?

risposta

7

I flussi sono pigri.

import ceylon.math.float {random} 

value rng = {random()}.cycled; 

Quindi questo è un flusso lento e infinito di numeri casuali. La funzione random non viene richiamata quando si costruisce il flusso. D'altra parte, una sequenza valuterà avidamente i suoi argomenti, in questo caso dandovi il risultato di una singola chiamata di random ripetutamente. Un altro esempio:

function prepend<Element>(Element first, {Element*} rest) => {first, *rest}; 

Qui, il flusso rest si sviluppa sul risultante flusso, ma solo su richiesta.

5

Esattamente quello @gdejohn detto, ma voglio sottolineare che la pigrizia è particolarmente importante per le prestazioni se avete intenzione di applicare più operazioni al flusso, ad esempio:

value stream = { random() }.cycled 
     .filter((x) => x>0.5) 
     .map((x) => (x*100).integer); 
printAll(stream.take(1000)); 

Qui evitare sempre materializzare un'intera sequenza di lunghezza 1000, poiché ognuna delle operazioni intermedie: cycled, filter(), map() e take() restituisce un flusso. E anche printAll() non ha bisogno di materializzare una sequenza.

+0

A parte la roba 'random()' che viene chiamata più volte (cosa che non avevo realizzato fino ad ora), la stessa cosa avrebbe funzionato con '[...]', no? '[5] .cycled' restituirà comunque un pigro iterabile. –

+0

Sì, '[5] .cycled' è pigro. Non tenta di materializzare una sequenza infinita :-) –

Problemi correlati