1. Giulio Piancastelli
  2. scala-it

Commits

gpiancastelli  committed f43efd4

Itself.

  • Participants
  • Parent commits 8222c89
  • Branches default

Comments (0)

Files changed (4)

File cap-1.html

View file
 
 <p><code>Triangle</code> segue lo stesso schema. Prende tre istanze di <code>Point</code> come argomenti del proprio costruttore.
 
-<p>Tutti i metodi <code>draw</code> nelle classi <code>Circle</code>, <code>Rectangle</code> e <code>Triangle</code> usano <code>this</code>. Come in Java e C#, <code>this</code> è il modo in cui un&#8217;istanza fa riferimento a sé stessa. In questo contesto, dove <code>this</code> è la parte destra di un&#8217;espressione che concatena stringhe (usando il segno più), <code>this.toString</code> viene invocato implicitamente.
+<p>Tutti i metodi <code>draw</code> nelle classi <code>Circle</code>, <code>Rectangle</code> e <code>Triangle</code> usano <code>this</code>. Come in Java e C#, <code>this</code> è il modo in cui un&#8217;istanza fa riferimento a se stessa. In questo contesto, dove <code>this</code> è la parte destra di un&#8217;espressione che concatena stringhe (usando il segno più), <code>this.toString</code> viene invocato implicitamente.
 
 <blockquote class=note>
 <p><span class=u>&#x261E;</span>Naturalmente, in un&#8217;applicazione reale non implementereste le operazioni di disegno nelle classi che fanno parte del &#8220;modello del dominio&#8221; in questo modo, dato che l&#8217;implementazione dipenderebbe da dettagli come la piattaforma del sistema operativo, le <abbr>API</abbr> grafiche, <i class=baa>&amp;</i>c. Vedremo un approccio di progettazione migliore quando discuteremo i <em>tratti</em> nel <a href=cap-4.html>capitolo 4</a>.

File cap-2.html

View file
 println(factorial(4))
 println(factorial(5))</code></pre>
 
-<p>Il secondo metodo invoca sé stesso ricorsivamente, passando un parametro <var>accumulator</var> in cui viene &#8220;accumulato&#8221; il risultato del calcolo. Notate che, quando il contatore <var>i</var> raggiunge 1, restituiamo il valore accumulato. (Stiamo ignorando gli interi negativi non validi. La funzione in realtà restituisce 1 per <code>i &lt; 0</code>.) Dopo aver definito il metodo annidato, <code>factorial</code> lo invoca con il valore <var>i</var> che gli viene passato e con il valore iniziale 1 per l&#8217;accumulatore.
+<p>Il secondo metodo invoca se stesso ricorsivamente, passando un parametro <var>accumulator</var> in cui viene &#8220;accumulato&#8221; il risultato del calcolo. Notate che, quando il contatore <var>i</var> raggiunge 1, restituiamo il valore accumulato. (Stiamo ignorando gli interi negativi non validi. La funzione in realtà restituisce 1 per <code>i &lt; 0</code>.) Dopo aver definito il metodo annidato, <code>factorial</code> lo invoca con il valore <var>i</var> che gli viene passato e con il valore iniziale 1 per l&#8217;accumulatore.
 
 <p>Come accade per le dichiarazioni di variabili locali in molti linguaggi, un metodo annidato è visibile solamente all&#8217;interno del metodo che lo include. Se provate a invocare <code>fact</code> al di fuori di <code>factorial</code>, otterrete un errore di compilazione.
 
 <td align=left valign=top><p>la sezione <a href=cap-6.html#OverridingMethods>Ridefinire i metodi astratti e concreti</a> nel <a href=cap-6.html>capitolo 6</a>
 <tr>
 <td align=left valign=top><p><code>this</code>
-<td align=left valign=top><p>Il modo in cui un oggetto fa riferimento a sé stesso. Il nome del metodo per i <em>costruttori ausiliari</em>.
+<td align=left valign=top><p>Il modo in cui un oggetto fa riferimento a se stesso. Il nome del metodo per i <em>costruttori ausiliari</em>.
 <td align=left valign=top><p>la sezione <a href=cap-5.html#ClassBasics>I concetti di base per classi e oggetti</a> nel <a href=cap-5.html>capitolo 5</a>
 <tr>
 <td align=left valign=top><p><code>throw</code>

File cap-5.html

View file
 
 <p>Le classi si dichiarano con la parola chiave <code>class</code>. Vedremo più avanti che si possono usare anche parole chiave aggiuntive, come <code>final</code> per prevenire la creazione di classi <em>derivate</em> e <code>abstract</code> per indicare che una classe non può essere istanziata, di solito perché contiene o eredita dichiarazioni di membro senza fornirne le definizioni complete.
 
-<p>Un&#8217;istanza può fare riferimento a sé stessa usando la parola chiave <code>this</code>, proprio come in Java e in linguaggi simili.
+<p>Un&#8217;istanza può fare riferimento a se stessa usando la parola chiave <code>this</code>, proprio come in Java e in linguaggi simili.
 
 <p>Seguendo la convenzione di Scala, usiamo il termine <em>metodo</em> per indicare una funzione che è legata a un&#8217;istanza. Alcuni linguaggi orientati agli oggetti usano il termine &#8220;funzione membro&#8221;. Le definizioni di metodo cominciano con la parola chiave <code>def</code>.
 

File cap-8.html

View file
 
 <p>Tuttavia, <var>factor</var> non è un parametro formale, ma un riferimento a una variabile nell&#8217;ambito esterno. Quindi, il compilatore crea una <em>chiusura</em> che racchiude (o si &#8220;chiude sopra&#8221;) <code>multiplier</code> e il contesto esterno delle variabili non legate a cui <code>multiplier</code> fa riferimento, legando in questo modo anche quelle variabili.
 
-<p>Questo è il motivo per cui il comportamento di <code>multiplier</code> è cambiato dopo la modifica di <var>factor</var>. La funzione fa riferimento a <var>factor</var> e legge il suo valore corrente ogni volta. Se una funzione non ha riferimenti esterni, allora è banalmente chiusa su sé stessa e non richiede nessun contesto esterno.
+<p>Questo è il motivo per cui il comportamento di <code>multiplier</code> è cambiato dopo la modifica di <var>factor</var>. La funzione fa riferimento a <var>factor</var> e legge il suo valore corrente ogni volta. Se una funzione non ha riferimenti esterni, allora è banalmente chiusa su se stessa e non richiede nessun contesto esterno.
 
 <h3 id=PurityInsideVsOutside>Purezza interna ed esterna</h3>
 
 
 <h2 id=TailCalls>La ricorsione in coda e la sua ottimizzazione</h2>
 
-<p>La <em>ricorsione in coda</em> è un tipo particolare di ricorsione che avviene quando la funzione richiama sé stessa come sua ultima operazione. La ricorsione in coda è molto importante, perché è il tipo di ricorsione più facile da ottimizzare con la conversione in un ciclo. I cicli eliminano il potenziale stack overflow e migliorano le prestazioni eliminando il costo aggiuntivo della chiamata ricorsiva di funzione. Nonostante l&#8217;ottimizzazione della ricorsione in coda non sia ancora supportata nativamente dalla <abbr>JVM</abbr>, <kbd>scalac</kbd> può effettuarla.
+<p>La <em>ricorsione in coda</em> è un tipo particolare di ricorsione che avviene quando la funzione richiama se stessa come sua ultima operazione. La ricorsione in coda è molto importante, perché è il tipo di ricorsione più facile da ottimizzare con la conversione in un ciclo. I cicli eliminano il potenziale stack overflow e migliorano le prestazioni eliminando il costo aggiuntivo della chiamata ricorsiva di funzione. Nonostante l&#8217;ottimizzazione della ricorsione in coda non sia ancora supportata nativamente dalla <abbr>JVM</abbr>, <kbd>scalac</kbd> può effettuarla.
 
 <p>Tuttavia, il nostro esempio del fattoriale non è una ricorsione in coda, perché <code>factorial</code> si richiama e <em>poi</em> opera una moltiplicazione tra i risultati. &Egrave; possibile implementare <code>factorial</code> in modo da usare la ricorsione in coda. In effetti, ne abbiamo vista un&#8217;implementazione nella sezione <a href=cap-2.html#NestingMethodDefinitions>Annidare le definizioni di metodo</a> del capitolo 2. Tuttavia, quell&#8217;esempio non usava alcuni costrutti che abbiamo imparato nel frattempo, come le espressioni <code>for</code> e il pattern matching. Quindi, ecco una nuova implementazione di <code>factorial</code> che effettua i calcoli con la ricorsione in coda.
 
 <p>L&#8217;annidamento di una funzione ricorsiva in coda che usa un accumulatore è una tecnica idiomatica molto utile per convertire molti algoritmi ricorsivi in ricorsioni in coda che possono essere ottimizzate da <kbd>scalac</kbd> sotto forma di cicli.
 
 <blockquote class=note>
-<p><span class=u>&#x261E;</span>L&#8217;ottimizzazione della ricorsione in coda non verrà applicata quando un metodo che chiama sé stesso può essere ridefinito in un tipo derivato. Il metodo deve essere dichiarato <code>private</code> o <code>final</code>, definito in un <code>object</code>, o annidato in un altro metodo (come <code>fact</code> nel nostro esempio). La nuova annotazione <code>@tailrec</code> introdotta nella versione 2.8 genererà un errore se il compilatore non riesce a ottimizzare il metodo annotato. (Si veda la sezione <a href=cap-13.html#Annotations>Annotazioni</a> nel capitolo 13.)
+<p><span class=u>&#x261E;</span>L&#8217;ottimizzazione della ricorsione in coda non verrà applicata quando un metodo che chiama se stesso può essere ridefinito in un tipo derivato. Il metodo deve essere dichiarato <code>private</code> o <code>final</code>, definito in un <code>object</code>, o annidato in un altro metodo (come <code>fact</code> nel nostro esempio). La nuova annotazione <code>@tailrec</code> introdotta nella versione 2.8 genererà un errore se il compilatore non riesce a ottimizzare il metodo annotato. (Si veda la sezione <a href=cap-13.html#Annotations>Annotazioni</a> nel capitolo 13.)
 </blockquote>
 
 <h3 id=TrampolineTailCalls>Trampolino per le ricorsioni in coda</h3>