From 635507fb31526515d653ec4694501f77b2a2c09a Mon Sep 17 00:00:00 2001 From: bjornregnell Date: Mon, 13 Jul 2020 19:05:16 +0200 Subject: [PATCH] kill Traversable, migrate to 2.13 --- ...bstract-collections-solurows-generated.tex | 2 +- ...bstract-collections-taskrows-generated.tex | 2 +- .../generated/w07-chaphead-generated.tex | 1 - compendium/modules/w09-setmap-exercise.tex | 2 +- img/collection/collection-traits.png | Bin 14985 -> 39363 bytes plan/Plan.scala | 2 +- plan/module-plan-generated.html | 2 +- plan/module-plan-generated.md | 2 +- plan/module-plan-generated.tex | 2 +- quiz/QuizData.scala | 6 +- slides/body/lect-w07-seq.tex | 24 ++--- slides/body/lect-w09-collections.tex | 102 +++++------------- slides/generated/w07-overview-generated.tex | 1 - 13 files changed, 47 insertions(+), 101 deletions(-) diff --git a/compendium/generated/quiz-w07-abstract-collections-solurows-generated.tex b/compendium/generated/quiz-w07-abstract-collections-solurows-generated.tex index 706d45ab9..a7b7b129f 100644 --- a/compendium/generated/quiz-w07-abstract-collections-solurows-generated.tex +++ b/compendium/generated/quiz-w07-abstract-collections-solurows-generated.tex @@ -1,3 +1,3 @@ - Traversable & 1 & ~~\Large$\leadsto$~~ & A & bastyp för alla samlingar, har metoden \code|foreach| \\ + Iterable & 1 & ~~\Large$\leadsto$~~ & A & bastyp för alla samlingar, har metoden \code|foreach| \\ Iterable & 2 & ~~\Large$\leadsto$~~ & B & är traverserbar med hjälp av metoden \code|iterator| \\ Seq & 3 & ~~\Large$\leadsto$~~ & C & bastyp för alla sekvenssamlingar, indexposition från 0 \\ \ No newline at end of file diff --git a/compendium/generated/quiz-w07-abstract-collections-taskrows-generated.tex b/compendium/generated/quiz-w07-abstract-collections-taskrows-generated.tex index 7e86b7eb1..1192ce84d 100644 --- a/compendium/generated/quiz-w07-abstract-collections-taskrows-generated.tex +++ b/compendium/generated/quiz-w07-abstract-collections-taskrows-generated.tex @@ -1,3 +1,3 @@ - Traversable & 1 & & A & bastyp för alla samlingar, har metoden \code|foreach| \\ + Iterable & 1 & & A & bastyp för alla samlingar, har metoden \code|foreach| \\ Iterable & 2 & & B & är traverserbar med hjälp av metoden \code|iterator| \\ Seq & 3 & & C & bastyp för alla sekvenssamlingar, indexposition från 0 \\ \ No newline at end of file diff --git a/compendium/generated/w07-chaphead-generated.tex b/compendium/generated/w07-chaphead-generated.tex index 76405a413..0f2986f7e 100644 --- a/compendium/generated/w07-chaphead-generated.tex +++ b/compendium/generated/w07-chaphead-generated.tex @@ -4,7 +4,6 @@ \chapter{Sekvenser}\label{chapter:W07} \begin{multicols}{2}\begin{itemize}[noitemsep,label={$\square$},leftmargin=*] \item översikt av Scalas samlingsbibliotek och samlingsmetoder \item klasshierarkin i scala.collection -\item Traversable \item Iterable \item Seq \item List diff --git a/compendium/modules/w09-setmap-exercise.tex b/compendium/modules/w09-setmap-exercise.tex index ce44aad40..98178d42a 100644 --- a/compendium/modules/w09-setmap-exercise.tex +++ b/compendium/modules/w09-setmap-exercise.tex @@ -559,7 +559,7 @@ \Task \what~Vi ska nu utnyttja ett riktigt listigt trick för att via en enda kodrad implementera registrering med hjälp av samlingsmetoderna \code{groupBy} och \code{map}. -\Subtask Läs om metoden \code{groupBy} i snabbreferensen. Du hittar den under rubriken \emph{''Methods in trait \code{Traversable[A]}''} eftersom \code{groupBy} fungerar på alla samlingar. Testa \code{groupBy} enligt nedan och beskriv vad som händer. +\Subtask Läs om metoden \code{groupBy} i snabbreferensen. Du hittar den under rubriken \emph{''Methods in trait \code{Iterable[A]}''} eftersom \code{groupBy} fungerar på alla samlingar. Testa \code{groupBy} enligt nedan och beskriv vad som händer. \begin{REPL} scala> val xs = Vector(1, 1, 2, 2, 4, 4, 4).groupBy(x => x > 2) diff --git a/img/collection/collection-traits.png b/img/collection/collection-traits.png index 65abca6fa1448a3cb3e593552669394e77742227..58c178e8f639effcfeb4b6757127e42220edfaa6 100644 GIT binary patch literal 39363 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 Z5&uM+dJo)<9RX~Btj!(F@FrJN{|o3$-EaT^ literal 14985 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 diff --git a/plan/Plan.scala b/plan/Plan.scala index b403b770d..302daac0a 100644 --- a/plan/Plan.scala +++ b/plan/Plan.scala @@ -99,7 +99,7 @@ trait Plan { Module("Sekvenser", id = "sequences", exercise = "sequences", lab = "shuffle", contents = """ | översikt av Scalas samlingsbibliotek och samlingsmetoder, - | klasshierarkin i scala.collection, Traversable, Iterable, + | klasshierarkin i scala.collection, Iterable, | Seq, List, ListBuffer, ArrayBuffer, WrappedArray, | sekvensalgoritm, algoritm: SEQ-COPY, | in-place vs copy, algoritm: SEQ-REVERSE, diff --git a/plan/module-plan-generated.html b/plan/module-plan-generated.html index 4bbe443ab..5ae146a60 100644 --- a/plan/module-plan-generated.html +++ b/plan/module-plan-generated.html @@ -33,7 +33,7 @@ W07 Sekvenser -översikt av Scalas samlingsbibliotek och samlingsmetoder, klasshierarkin i scala.collection, Traversable, Iterable, Seq, List, ListBuffer, ArrayBuffer, WrappedArray, sekvensalgoritm, algoritm: SEQ-COPY, in-place vs copy, algoritm: SEQ-REVERSE, registrering, algoritm: SEQ-REGISTER, linjärsökning, algoritm: LINEAR-SEARCH, tidskomplexitet, minneskomplexitet, sekvenser i Java vs Scala, for-sats i Java, java.util.Scanner, översikt strängmetoder, StringBuilder, ordning, inbyggda sökmetoder, find, indexOf, indexWhere, inbyggda sorteringsmetoder, sorted, sortWith, sortBy, repeterade parametrar +översikt av Scalas samlingsbibliotek och samlingsmetoder, klasshierarkin i scala.collection, Iterable, Seq, List, ListBuffer, ArrayBuffer, WrappedArray, sekvensalgoritm, algoritm: SEQ-COPY, in-place vs copy, algoritm: SEQ-REVERSE, registrering, algoritm: SEQ-REGISTER, linjärsökning, algoritm: LINEAR-SEARCH, tidskomplexitet, minneskomplexitet, sekvenser i Java vs Scala, for-sats i Java, java.util.Scanner, översikt strängmetoder, StringBuilder, ordning, inbyggda sökmetoder, find, indexOf, indexWhere, inbyggda sorteringsmetoder, sorted, sortWith, sortBy, repeterade parametrar KS KONTROLLSKRIVN. diff --git a/plan/module-plan-generated.md b/plan/module-plan-generated.md index 23e66f14b..3aae1b111 100644 --- a/plan/module-plan-generated.md +++ b/plan/module-plan-generated.md @@ -6,7 +6,7 @@ | W04 | Objekt | modul, singelobjekt, paket, punktnotation, tillstånd, medlem, attribut, metod, paket, import, filstruktur, jar, dokumentation, programlayout, JDK, import, selektiv import, namnbyte vid import, tupel, multipla returvärden, block, lokal variabel, skuggning, lokal funktion, funktioner är objekt med apply-metod, namnrymd, synlighet, privat medlem, inkapsling, getter och setter, principen om uniform access, överlagring av metoder, introprog.PixelWindow, initialisering, lazy val, värdeandrop, namnanrop, typalias | | W05 | Klasser | objektorientering, klass, instans, Point, Square, Complex, Any, isInstanceOf, toString, new, null, this, accessregler, private, private[this], klassparameter, primär konstruktor, fabriksmetod, alternativ konstruktor, förändringsbar, oföränderlig, case-klass, kompanjonsobjekt, referenslikhet, innehållslikhet, eq, == | | W06 | Mönster, undantag | mönstermatchning, match, Option, throw, try, catch, Try, unapply, sealed, flatten, flatMap, partiella funktioner, collect, wildcard-mönster, variabelbindning i mönster, sekvens-wildcard, bokstavliga mönster, implementera equals, hashcode, exempel: equals för klassen Complex, switch-sats i Java | -| W07 | Sekvenser | översikt av Scalas samlingsbibliotek och samlingsmetoder, klasshierarkin i scala.collection, Traversable, Iterable, Seq, List, ListBuffer, ArrayBuffer, WrappedArray, sekvensalgoritm, algoritm: SEQ-COPY, in-place vs copy, algoritm: SEQ-REVERSE, registrering, algoritm: SEQ-REGISTER, linjärsökning, algoritm: LINEAR-SEARCH, tidskomplexitet, minneskomplexitet, sekvenser i Java vs Scala, for-sats i Java, java.util.Scanner, översikt strängmetoder, StringBuilder, ordning, inbyggda sökmetoder, find, indexOf, indexWhere, inbyggda sorteringsmetoder, sorted, sortWith, sortBy, repeterade parametrar | +| W07 | Sekvenser | översikt av Scalas samlingsbibliotek och samlingsmetoder, klasshierarkin i scala.collection, Iterable, Seq, List, ListBuffer, ArrayBuffer, WrappedArray, sekvensalgoritm, algoritm: SEQ-COPY, in-place vs copy, algoritm: SEQ-REVERSE, registrering, algoritm: SEQ-REGISTER, linjärsökning, algoritm: LINEAR-SEARCH, tidskomplexitet, minneskomplexitet, sekvenser i Java vs Scala, for-sats i Java, java.util.Scanner, översikt strängmetoder, StringBuilder, ordning, inbyggda sökmetoder, find, indexOf, indexWhere, inbyggda sorteringsmetoder, sorted, sortWith, sortBy, repeterade parametrar | | KS | KONTROLLSKRIVN. | | | W08 | Matriser, typparametrar | matris, nästlad samling, nästlad for-sats, typparameter, generisk funktion, generisk klass, fri vs bunden typparameter, generisk samling som typparameter, matriser i Java vs Scala, allokering av nästlade arrayer i Scala och Java | | W09 | Mängder, tabeller | innehållstest, mängd, Set, mutable.Set, nyckel-värde-tabell, Map, mutable.Map, hash code, java.util.HashMap, java.util.HashSet, persistens, serialisering, textfiler, Source.fromFile, java.nio.file, repetition inför kontrollskrivning | diff --git a/plan/module-plan-generated.tex b/plan/module-plan-generated.tex index 940c7a136..18faa356c 100644 --- a/plan/module-plan-generated.tex +++ b/plan/module-plan-generated.tex @@ -4,7 +4,7 @@ W04 & Objekt & modul, singelobjekt, paket, punktnotation, tillstånd, medlem, attribut, metod, paket, import, filstruktur, jar, dokumentation, programlayout, JDK, import, selektiv import, namnbyte vid import, tupel, multipla returvärden, block, lokal variabel, skuggning, lokal funktion, funktioner är objekt med apply-metod, namnrymd, synlighet, privat medlem, inkapsling, getter och setter, principen om uniform access, överlagring av metoder, introprog.PixelWindow, initialisering, lazy val, värdeandrop, namnanrop, typalias \\ W05 & Klasser & objektorientering, klass, instans, Point, Square, Complex, Any, isInstanceOf, toString, new, null, this, accessregler, private, private[this], klassparameter, primär konstruktor, fabriksmetod, alternativ konstruktor, förändringsbar, oföränderlig, case-klass, kompanjonsobjekt, referenslikhet, innehållslikhet, eq, == \\ W06 & Mönster, undantag & mönstermatchning, match, Option, throw, try, catch, Try, unapply, sealed, flatten, flatMap, partiella funktioner, collect, wildcard-mönster, variabelbindning i mönster, sekvens-wildcard, bokstavliga mönster, implementera equals, hashcode, exempel: equals för klassen Complex, switch-sats i Java \\ -W07 & Sekvenser & översikt av Scalas samlingsbibliotek och samlingsmetoder, klasshierarkin i scala.collection, Traversable, Iterable, Seq, List, ListBuffer, ArrayBuffer, WrappedArray, sekvensalgoritm, algoritm: SEQ-COPY, in-place vs copy, algoritm: SEQ-REVERSE, registrering, algoritm: SEQ-REGISTER, linjärsökning, algoritm: LINEAR-SEARCH, tidskomplexitet, minneskomplexitet, sekvenser i Java vs Scala, for-sats i Java, java.util.Scanner, översikt strängmetoder, StringBuilder, ordning, inbyggda sökmetoder, find, indexOf, indexWhere, inbyggda sorteringsmetoder, sorted, sortWith, sortBy, repeterade parametrar \\ +W07 & Sekvenser & översikt av Scalas samlingsbibliotek och samlingsmetoder, klasshierarkin i scala.collection, Iterable, Seq, List, ListBuffer, ArrayBuffer, WrappedArray, sekvensalgoritm, algoritm: SEQ-COPY, in-place vs copy, algoritm: SEQ-REVERSE, registrering, algoritm: SEQ-REGISTER, linjärsökning, algoritm: LINEAR-SEARCH, tidskomplexitet, minneskomplexitet, sekvenser i Java vs Scala, for-sats i Java, java.util.Scanner, översikt strängmetoder, StringBuilder, ordning, inbyggda sökmetoder, find, indexOf, indexWhere, inbyggda sorteringsmetoder, sorted, sortWith, sortBy, repeterade parametrar \\ KS & \multicolumn{2}{l}{KONTROLLSKRIVN.} \\ W08 & Matriser, typparametrar & matris, nästlad samling, nästlad for-sats, typparameter, generisk funktion, generisk klass, fri vs bunden typparameter, generisk samling som typparameter, matriser i Java vs Scala, allokering av nästlade arrayer i Scala och Java \\ W09 & Mängder, tabeller & innehållstest, mängd, Set, mutable.Set, nyckel-värde-tabell, Map, mutable.Map, hash code, java.util.HashMap, java.util.HashSet, persistens, serialisering, textfiler, Source.fromFile, java.nio.file, repetition inför kontrollskrivning \\ diff --git a/quiz/QuizData.scala b/quiz/QuizData.scala index 77ec65a76..468fc2b3e 100644 --- a/quiz/QuizData.scala +++ b/quiz/QuizData.scala @@ -305,9 +305,9 @@ object QuizData { // to generate tables for a concept connection quizes in late ).filter(_._1.trim.nonEmpty), QuizID("quiz-w07-abstract-collections") -> Vector( //sequences - "Traversable " -> "bastyp för alla samlingar, har metoden \\code|foreach|", - "Iterable " -> "är traverserbar med hjälp av metoden \\code|iterator|", - "Seq " -> "bastyp för alla sekvenssamlingar, indexposition från 0", + "Iterable " -> "bastyp för alla samlingar, har metoden \\code|foreach|", + "Iterable " -> "är traverserbar med hjälp av metoden \\code|iterator|", + "Seq " -> "bastyp för alla sekvenssamlingar, indexposition från 0", "" -> "" ).filter(_._1.trim.nonEmpty), diff --git a/slides/body/lect-w07-seq.tex b/slides/body/lect-w07-seq.tex index d7bcd1ec3..239f1f8a4 100644 --- a/slides/body/lect-w07-seq.tex +++ b/slides/body/lect-w07-seq.tex @@ -377,32 +377,26 @@ \end{Slide} -\begin{Slide}{Hierarki av samlingstyper i \texttt{scala.collection} v2.12} +\begin{Slide}{Hierarki av samlingstyper i \texttt{scala.collection} v2.13} \begin{multicols}{2} - \begin{tikzpicture}[sibling distance=6.1em,->,>=stealth', inner sep=3pt, %scale=0.5, + \begin{tikzpicture}[sibling distance=5.0em,->,>=stealth', inner sep=3pt, %scale=0.5, every node/.style = {shape=rectangle, draw, align=center,font=\small\ttfamily}, class/.style = {fill=blue!20}, trait/.style = {rounded corners, fill=red!20}] - \node[trait] {Traversable} - child { node[trait] {Iterable} - child { node[trait] {Seq} - } - child { node[trait] {Set} - } - child { node[trait] {Map} - } - }; + \node[trait] {Iterable} + child { node[trait] {Seq} } + child { node[trait] {Set} } + child { node[trait] {Map} } + ; \end{tikzpicture} \columnbreak {\SlideFontTiny - \code{Traversable} har metoder som är implementerade med hjälp av: \\ + \code{Iterable} har metoder som är implementerade med hjälp av: \\ \code{def foreach[U](f: Elem => U): Unit}\\ - - \vspace{1em}\code{Iterable} har metoder som är implementerade med hjälp av: \\ \code{def iterator: Iterator[A] } } @@ -416,7 +410,7 @@ \end{multicols} - {\SlideFontSmall Samlingen \Emph{\texttt{Vector}} är en \code{Seq} som är en \code{Iterable} som är en \code{Traversable}. \\ \vspace{0.5em}\pause + {\SlideFontSmall Samlingen \Emph{\texttt{Vector}} är en \code{Seq} som är en \code{Iterable}. \\ \vspace{0.5em}\pause De konkreta samlingarna är uppdelade i dessa paket:\\ \code{scala.collection.immutable} \hfill som är \Emph{automatiskt} importerade\\ \code{scala.collection.mutable} \hfill som \Alert{måste importeras} explicit\\\pause diff --git a/slides/body/lect-w09-collections.tex b/slides/body/lect-w09-collections.tex index 5cdb6e48f..9c64f937b 100644 --- a/slides/body/lect-w09-collections.tex +++ b/slides/body/lect-w09-collections.tex @@ -276,54 +276,6 @@ -\begin{Slide}{Hierarki av samlingstyper i \texttt{scala.collection} v2.12} - -\begin{multicols}{2} -\begin{tikzpicture}[sibling distance=6.1em,->,>=stealth', inner sep=3pt, %scale=0.5, - every node/.style = {shape=rectangle, draw, align=center,font=\small\ttfamily}, - class/.style = {fill=blue!20}, - trait/.style = {rounded corners, fill=red!20}] - \node[trait] {Traversable} - child { node[trait] {Iterable} - child { node[trait] {Seq} - } - child { node[trait] {Set} - } - child { node[trait] {Map} - } - }; -\end{tikzpicture} - -\columnbreak - -{\SlideFontTiny - -\code{Traversable} har metoder som är implementerade med hjälp av: \\ -\code{def foreach[U](f: Elem => U): Unit}\\ - -\vspace{1em}\code{Iterable} har metoder som är implementerade med hjälp av: \\ -\code{def iterator: Iterator[A] } - -} - -\begin{itemize}\SlideFontTiny -\item[] \code{Seq}: ordnade i sekvens -\item[] \code{Set}: unika element -\item[] \code{Map}: par av (nyckel, värde) -\end{itemize} - - -\end{multicols} - -{\SlideFontSmall Samlingen \Emph{\texttt{Vector}} är en \code{Seq} som är en \code{Iterable} som är en \code{Traversable}. \\ \vspace{0.5em}\pause -De konkreta samlingarna är uppdelade i dessa paket:\\ -\code{scala.collection.immutable} \hfill som är \Emph{automatiskt} importerade\\ -\code{scala.collection.mutable} \hfill som \Alert{måste importeras} explicit\\\pause -(undantag: primitiva \code{scala.Array} som är automatiskt synlig) -} -\end{Slide} - - \begin{Slide}{Hierarki av samlingstyper i \texttt{scala.collection} v2.13} \begin{multicols}{2} @@ -395,20 +347,20 @@ -\ifkompendium -\else -\begin{Slide}{Hierarki av samlingar i scala.collection v2.12}\SlideFontTiny -\includegraphics[width=0.95\textwidth]{../img/collection/collection-traits}\\ -%\noindent Läs mer om Scalas samlingar här: \\ -\url{https://docs.scala-lang.org/overviews/collections/overview.html} -\end{Slide} -\fi +% \ifkompendium +% \else +% \begin{Slide}{Hierarki av samlingar i scala.collection v2.12}\SlideFontTiny +% \includegraphics[width=0.6\textwidth]{../img/collection/collection-traits}\\ +% %\noindent Läs mer om Scalas samlingar här: \\ +% \url{https://docs.scala-lang.org/overviews/collections/overview.html} +% \end{Slide} +% \fi -\begin{Slide}{Mer specifika samlingstyper i \texttt{scala.collection} v2.12} +\begin{Slide}{Mer specifika samlingstyper i \texttt{scala.collection}} Det finns \Alert{mer specifika} \Emph{subtyper} av \code{Seq}, \code{Set} och \code{Map}: \\ \vspace{1em} @@ -416,8 +368,7 @@ every node/.style = {shape=rectangle, draw, align=center,font=\small\ttfamily}, class/.style = {fill=blue!20}, trait/.style = {rounded corners, fill=red!20}] - \node[trait] {Traversable} - child { node[trait] {Iterable} + \node[trait] {Iterable} child { node[trait, xshift=-2.4cm] {Seq} child { node[trait] {IndexedSeq} } child { node[trait] {LinearSeq} } @@ -428,13 +379,18 @@ } child { node[trait, xshift=1.0cm] {Map} child { node[trait] {SortedMap} } - } }; \end{tikzpicture} -\vspace{0.5em} +\pause\vspace{0.5em} \Emph{\texttt{Vector}} är en \Alert{\texttt{IndexedSeq}} medan \Emph{\texttt{List}} är en \Alert{\texttt{LinearSeq}}. + +\pause\vspace{1em}{\SlideFontSmall +\href +{https://docs.scala-lang.org/overviews/collections-2.13/overview.html} +{docs.scala-lang.org/overviews/collections-2.13/overview.html} +} \end{Slide} \begin{Slide}{Några oföränderliga och förändringsbara sekvenssamlingar}\SlideFontSmall @@ -463,7 +419,7 @@ \begin{Slide}{Några användbara metoder på samlingar}\SlideFontTiny \begin{tabular}{r r l}\hline -\texttt{\Emph{Traversable}} +\texttt{\Emph{Iterable}} & \code|xs.size| & antal elementet \\ & \code|xs.head| & första elementet \\ & \code|xs.last| & sista elementet \\ @@ -473,9 +429,7 @@ & \code|xs.map(f)| & gör \code|f| på alla element, ger ny samling \\ & \code|xs.filter(p)| & ny samling med bara de element där p är sant\\ & \code|xs.groupBy(f)| & ger en \code|Map| som grupperar värdena enligt f\\ - & \code|xs.mkString(",")| & en kommaseparerad sträng med alla element\\ \hline - -\texttt{\Emph{Iterable}} + & \code|xs.mkString(",")| & en kommaseparerad sträng med alla element\\ & \code|xs.zip(ys)| & ny samling med par (x, y); ''zippa ihop'' xs och ys \\ & \code|xs.zipWithIndex| & ger en \code|Map| med par (x, index för x) \\ & \code|xs.sliding(n)| & ny samling av samlingar genom glidande ''fönster''\\ \hline @@ -554,19 +508,19 @@ \end{Slide} -\ifkompendium\else +% \ifkompendium\else -\begin{Slide}{scala.collection.immutable} -\includegraphics[width=0.67\textwidth]{../img/collection/collection-immutable}~~% -\includegraphics[width=0.3\textwidth]{../img/collection/collection-legend} -\end{Slide} +% \begin{Slide}{scala.collection.immutable} +% \includegraphics[width=0.67\textwidth]{../img/collection/collection-immutable}~~% +% \includegraphics[width=0.3\textwidth]{../img/collection/collection-legend} +% \end{Slide} -\begin{Slide}{scala.collection.mutable} -\includegraphics[width=1.05\textwidth]{../img/collection/collection-mutable} -\end{Slide} +% \begin{Slide}{scala.collection.mutable} +% \includegraphics[width=1.05\textwidth]{../img/collection/collection-mutable} +% \end{Slide} -\fi +% \fi \begin{Slide}{Strängar är implicit en \texttt{IndexedSeq[Char]}}\SlideFontSmall Det finns en så kallad \Emph{implicit konvertering} mellan \code{String} och \code{IndexedSeq[Char]} vilket gör att \Alert{alla samlingsmetoder på \texttt{Seq} även funkar på strängar} och även flera andra smidiga strängmetoder erbjuds \Alert{utöver} de som finns i \href{http://docs.oracle.com/javase/8/docs/api/java/lang/String.html}{\code{java.lang.String}} genom klassen \href{http://www.scala-lang.org/api/current/scala/collection/immutable/StringOps.html}{\code{StringOps}}. diff --git a/slides/generated/w07-overview-generated.tex b/slides/generated/w07-overview-generated.tex index 2feba619a..237ad082e 100644 --- a/slides/generated/w07-overview-generated.tex +++ b/slides/generated/w07-overview-generated.tex @@ -4,7 +4,6 @@ \begin{multicols}{3}\SlideFontTiny $\square$ översikt av Scalas samlingsbibliotek och samlingsmetoder \\ $\square$ klasshierarkin i scala.collection \\ -$\square$ Traversable \\ $\square$ Iterable \\ $\square$ Seq \\ $\square$ List \\