Commits

gpiancastelli  committed 83ca6c2

Realign section titles.

  • Participants
  • Parent commits 6c23407

Comments (0)

Files changed (6)

 <p><span class=u>&#x261E;</span>La firma di tipo <code>B &gt;: A</code> dice che <code>B</code> deve essere un <em>supertipo</em> di <code>A</code>. Non esiste caso analogo in Java: l&#8217;espressione <code>B super A</code> non è valida.
 </blockquote>
 
-<h3 id=ACloserLookAtLists>Un&#8217;occhiata ravvicinata alle liste</h3>
+<h3 id=ACloserLookAtLists>Uno sguardo più attento alle liste</h3>
 
 <p>L&#8217;implementazione della classe <code>List</code> nella libreria Scala merita di essere analizzata nel dettaglio, dato che combina tutte le caratteristiche appena viste e illustra diversi idiomi utili per realizzare strutture dati immutabili in stile funzionale pienamente type-safe e comunque flessibili. Non mostreremo l&#8217;implementazione completa, omettendo <code>object List</code>, numerosi metodi della classe <code>List</code> e i commenti usati per generare la documentazione <em>Scaladoc</em>, ma incoraggiamo il lettore a esaminarla per proprio conto, scaricando la distribuzione del codice sorgente dal sito web del linguaggio <a href=apa.html#Scala>[Scala]</a> oppure visitando la pagina <em>Scaladoc</em> di <code>List</code>. Per evitare confusione con <code>scala.List</code>, useremo nomi diversi per la classe (che chiameremo <code>AbbrevList</code>) e per il package.
 
 
 <p>Abbiamo concluso l&#8217;ultimo capitolo con alcuni esempi &#8220;stuzzicanti&#8221; di codice Scala. Questo capitolo considera gli usi di Scala che promuovono codice sintetico e flessibile. Esamineremo l&#8217;organizzazione di file e package, i meccanismi per importare altri tipi, le dichiarazioni di variabile, varie convenzioni sintattiche e alcuni altri concetti. Metteremo in risalto il modo in cui la sintassi concisa di Scala vi aiuta a lavorare meglio e più velocemente.
 
-<p>La sintassi di Scala è particolarmente utile per scrivere script. Non è obbligatorio separare i passi di compilazione ed esecuzione per quei semplici programmi che hanno poche dipendenze nei confronti di librerie aggiuntive rispetto a quelle fornite da Scala. Potete compilare ed eseguire questi programmi in un unico passo con il comando <kbd>scala</kbd>. Se avete scaricato il codice di esempio del libro, molti degli esempi più piccoli possono essere eseguiti tramite il comando <kbd>scala</kbd>, invocando <code>scala <span class=var>nomefile</span>.scala</code>. Si vedano i file <span class=file>README.txt</span> negli esempi di codice del singolo capitolo per maggiori dettagli. Si veda anche la sezione <a href=cap-14.html#CommandLineTools>Gli strumenti a riga di comando</a> nel capitolo 14 per maggiori informazioni su come usare il comando <kbd>scala</kbd>.
+<p>La sintassi di Scala è particolarmente utile per scrivere script. Non è obbligatorio separare i passi di compilazione ed esecuzione per quei semplici programmi che hanno poche dipendenze nei confronti di librerie aggiuntive rispetto a quelle fornite da Scala. Potete compilare ed eseguire questi programmi in un unico passo con il comando <kbd>scala</kbd>. Se avete scaricato il codice di esempio del libro, molti degli esempi più piccoli possono essere eseguiti tramite il comando <kbd>scala</kbd>, invocando <code>scala <span class=var>nomefile</span>.scala</code>. Si vedano i file <span class=file>README.txt</span> negli esempi di codice del singolo capitolo per maggiori dettagli. Si veda anche la sezione <a href=cap-14.html#CommandLineTools>Strumenti a riga di comando</a> nel capitolo 14 per maggiori informazioni su come usare il comando <kbd>scala</kbd>.
 
 <h2 id=Semicolons>Punti e virgola</h2>
 
 <tr>
 <td align=left valign=top><p><code>&lt;%</code>
 <td align=left valign=top><p>Usato nelle dichiarazioni per i &#8220;limiti di vista&#8221; nelle dichiarazioni di tipi <em>parametrici</em> e <em>astratti</em>.
-<td align=left valign=top><p>la sezione <a href=cap-12.html#ViewsAndViewBounds>Viste e limiti di vista</a> nel <a href=cap-12.html>capitolo 12</a>
+<td align=left valign=top><p>la sezione <a href=cap-12.html#ViewsAndViewBounds>Viste e limiti sulle viste</a> nel <a href=cap-12.html>capitolo 12</a>
 <tr>
 <td align=left valign=top><p><code>&gt;:</code>
 <td align=left valign=top><p>Usato nelle dichiarazioni di tipi <em>parametrici</em> e <em>astratti</em> per vincolare i tipi permessi.
 
 <p>Notate che, anche senza dichiarare <var>upcasedBreed</var> come <code>val</code>, potete riutilizzarla all&#8217;interno del corpo della vostra espressione <code>for</code>. Questo approccio è ideale per trasformare gli elementi di una collezione man mano che la attraversate.
 
-<p>Infine, nella sezione <a href=cap-13.html#OptionsAndForComprehensions><code>Option</code> ed espressioni <code>for</code></a> del capitolo 13 vedremo come l&#8217;uso di <code>Option</code> con le espressioni <code>for</code> possa ridurre notevolmente la dimensione del codice eliminando controlli superflui per valori &#8220;nulli&#8221; o &#8220;mancanti&#8221;.
+<p>Infine, nella sezione <a href=cap-13.html#OptionsAndForComprehensions><code>Option</code> e le espressioni <code>for</code></a> del capitolo 13 vedremo come l&#8217;uso di <code>Option</code> con le espressioni <code>for</code> possa ridurre notevolmente la dimensione del codice eliminando controlli superflui per valori &#8220;nulli&#8221; o &#8220;mancanti&#8221;.
 
 <h2 id=OtherLoopingConstructs>Altri costrutti di ciclo</h2>
 
 
 <p>Dato che le enumerazioni di Scala sono solo normali oggetti, potreste usare qualsiasi oggetto che definisca diversi campi <code>val</code> per denotare i &#8220;valori di enumerazione&#8221;. Tuttavia, estendere <code>Enumeration</code> presenta diversi vantaggi: i valori vengono gestiti automaticamente come collezioni su cui potete iterare (come nei nostri esempi) e un identificatore numerico unico viene assegnato automaticamente a ogni valore.
 
-<p>Le classi <code>case</code> (si veda la sezione <a href=cap-6.html#CaseClasses>Classi <code>case</code></a> nel capitolo 6) vengono spesso usate al posto delle enumerazioni in Scala, perché i loro &#8220;casi d&#8217;uso&#8221; coinvolgono spesso il pattern matching. Riparleremo di questo argomento nella sezione <a href=cap-13.html#EnumerationsVsPatternMatching>Enumerazioni vs. pattern matching</a> del capitolo 13.
+<p>Le classi <code>case</code> (si veda la sezione <a href=cap-6.html#CaseClasses>Classi <code>case</code></a> nel capitolo 6) vengono spesso usate al posto delle enumerazioni in Scala, perché i loro &#8220;casi d&#8217;uso&#8221; coinvolgono spesso il pattern matching. Riparleremo di questo argomento nella sezione <a href=cap-13.html#EnumerationsVsPatternMatching>Un confronto tra enumerazioni e pattern matching</a> del capitolo 13.
 
 <h2 id=_recap_and_what_8217_s_next_3>Riepilogo, e poi?</h2>
 
 
 <p>La prima riga definisce un tipo per <code>Observer</code>. Questo è un <em>tipo strutturale</em> della forma <code>{ def receiveUpdate(subject: Any) }</code>. I tipi strutturali specificano solo la struttura che un sottotipo deve supportare; potete pensarli come tipi &#8220;anonimi&#8221;.
 
-<p>In questo caso, il tipo strutturale è definito da un metodo con una firma particolare. Qualsiasi tipo che sia dotato di un metodo con questa firma può essere usato come osservatore. Impareremo di più sui tipi strutturali nel <a href=cap-12.html>capitolo 12</a>. Se vi state chiedendo perché non abbiamo usato <code>Subject</code> come tipo dell&#8217;argomento invece di <code>Any</code>, rivisiteremo questa scelta nella sezione <a href=cap-13.html#SelfTypeAnnotationsAndAbstractTypeMembers>Annotazioni <em>selftype</em> e membri di tipo astratto</a> del capitolo 13.
+<p>In questo caso, il tipo strutturale è definito da un metodo con una firma particolare. Qualsiasi tipo che sia dotato di un metodo con questa firma può essere usato come osservatore. Impareremo di più sui tipi strutturali nel <a href=cap-12.html>capitolo 12</a>. Se vi state chiedendo perché non abbiamo usato <code>Subject</code> come tipo dell&#8217;argomento invece di <code>Any</code>, rivisiteremo questa scelta nella sezione <a href=cap-13.html#SelfTypeAnnotationsAndAbstractTypeMembers>Annotazioni <em>self-type</em> e membri tipo astratti</a> del capitolo 13.
 
 <p>Per ora, la cosa principale da notare è come questo tipo strutturale minimizzi le dipendenze tra il tratto <code>Subject</code> e qualsiasi potenziale utente del tratto.
 
 
 <pre><samp>java.lang.NoSuchMethodException: objects.Person.main([Ljava.lang.String;)</samp></pre>
 
-<p>Se decompilate il file <tt>objects/Person.class</tt> con <kbd>javap -classpath &hellip; objects.Person</kbd> (si veda la sezione <a href=cap-14.html#CommandLineToolDecompilers>Gli strumenti a riga di comando <kbd>scalap</kbd>, <kbd>javap</kbd> e <kbd>jad</kbd></a> nel capitolo 14), potete vedere che non contiene un metodo <code>main</code>. Se decompilate <tt>objects/Person$.class</tt>, che contiene il bytecode dell&#8217;oggetto associato, trovate un metodo <code>main</code> che però non è stato dichiarato <code>static</code>. Quindi, anche il tentativo di invocare <kbd>scala -cp &hellip; objects.Person$</kbd> non riuscirà a trovare il metodo <code>main</code> &#8220;statico&#8221;.
+<p>Se decompilate il file <tt>objects/Person.class</tt> con <kbd>javap -classpath &hellip; objects.Person</kbd> (si veda la sezione <a href=cap-14.html#CommandLineToolDecompilers>Gli strumenti <kbd>scalap</kbd>, <kbd>javap</kbd> e <kbd>jad</kbd> a riga di comando</a> nel capitolo 14), potete vedere che non contiene un metodo <code>main</code>. Se decompilate <tt>objects/Person$.class</tt>, che contiene il bytecode dell&#8217;oggetto associato, trovate un metodo <code>main</code> che però non è stato dichiarato <code>static</code>. Quindi, anche il tentativo di invocare <kbd>scala -cp &hellip; objects.Person$</kbd> non riuscirà a trovare il metodo <code>main</code> &#8220;statico&#8221;.
 
 <pre><samp>java.lang.NoSuchMethodException: objects.Person$.main is not static</samp></pre>
 
 <pre><code>val list2 = ("Chiunque" :: ("dovrebbe" :: ("leggere" :: list1)))
 val list2 = list1.::("leggere").::("dovrebbe").::("Chiunque")</code></pre>
 
-<p>In termini di prestazioni, l&#8217;aggiunta in testa è O(1). Vedremo perché quando esamineremo da vicino l&#8217;implementazione di <code>List</code> nella sezione <a href=cap-12.html#ACloserLookAtLists>Uno sguardo ravvicinato alle liste</a> del capitolo 12, dopo che avremo imparato qualcosa in più sui <em>tipi parametrici</em> in Scala.
+<p>In termini di prestazioni, l&#8217;aggiunta in testa è O(1). Vedremo perché quando esamineremo da vicino l&#8217;implementazione di <code>List</code> nella sezione <a href=cap-12.html#ACloserLookAtLists>Uno sguardo più attento alle liste</a> del capitolo 12, dopo che avremo imparato qualcosa in più sui <em>tipi parametrici</em> in Scala.
 
 <p>A differenza di alcune altre collezioni, Scala definisce <code>List</code> solo come tipo immutabile. Tuttavia, definisce anche alcuni tipi di lista mutabili, come <code>ListBuffer</code> e <code>LinkedList</code>.
 
 
 <p>La parola chiave <code>implicit</code> dice al compilatore che può usare questo metodo per una conversione &#8220;implicita&#8221; da <code>String</code> a <code>RichString</code> ogni volta che quest&#8217;ultima è necessaria. Il compilatore ha notato un tentativo di invocare il metodo <code>capitalize</code> e ha determinato che <code>RichString</code> è dotata di questo metodo; poi ha esaminato l&#8217;ambito di visibilità corrente per cercare un metodo <code>implicit</code> che convertisse <code>String</code> in <code>RichString</code>, trovando <code>stringWrapper</code>.
 
-<p>Come vedremo nella sezione <a href=cap-12.html#ViewsAndViewBounds>Viste e limiti di vista</a> del capitolo 12, a volte questi metodi di conversione vengono chiamati <em>viste</em>, nel senso che il nostro metodo <code>stringWrapper</code> offre una vista da <code>String</code> a <code>RichString</code>.
+<p>Come vedremo nella sezione <a href=cap-12.html#ViewsAndViewBounds>Viste e limiti sulle viste</a> del capitolo 12, a volte questi metodi di conversione vengono chiamati <em>viste</em>, nel senso che il nostro metodo <code>stringWrapper</code> offre una vista da <code>String</code> a <code>RichString</code>.
 
 <p><code>Predef</code> definisce molti altri metodi di conversione implicita, la maggior parte dei quali segue la convenzione nominale <code>vecchio2Nuovo</code>, dove <code>vecchio</code> è il tipo di oggetto disponibile e <code>Nuovo</code> è il tipo desiderato. Tuttavia, non c&#8217;è alcuna restrizione sui nomi dei metodi di conversione. Un certo numero di altre classi avvolgenti &#8220;ricche&#8221; viene definito nel package <code>scala.runtime</code>.
 
 
 <pre><samp>Fib = 1, 1, 2, 3, 5, 8, &hellip;</samp></pre>
 
-<p>Alcuni linguaggi funzionali puri sono ritardati per default, quindi imitano questo comportamento nella maniera più fedele possibile. Questo può funzionare senza esaurire le risorse della macchina se l&#8217;utente non cerca mai di utilizzare più di un sottoinsieme finito di questi valori. Scala non è un linguaggio ritardato per default, ma fornisce un supporto per lavorare con strutture dati infinite. Affronteremo questo argomento nella sezione <a href=cap-12.html#InfiniteDataStructuresAndLaziness>Strutture dati infinite e ritardo</a> del capitolo 12.
+<p>Alcuni linguaggi funzionali puri sono ritardati per default, quindi imitano questo comportamento nella maniera più fedele possibile. Questo può funzionare senza esaurire le risorse della macchina se l&#8217;utente non cerca mai di utilizzare più di un sottoinsieme finito di questi valori. Scala non è un linguaggio ritardato per default, ma fornisce un supporto per lavorare con strutture dati infinite. Affronteremo questo argomento nella sezione <a href=cap-12.html#InfiniteDataStructuresAndLaziness>Strutture dati infinite ed esecuzione ritardata</a> del capitolo 12.
 
 <h2 id=FunctionalComponentAbstractions>Riepilogo: le astrazioni per i componenti funzionali</h2>