本書の「はじめに」から引用する。
本書は Scala の入門書ですが、1 つ以上のプログラミング言語に慣れていることを前提としています。(中略) オブジェクト指向言語、特に Java の経験があればより理解しやすいようになっています。関数型プログラミング言語の経験は特に必要としていません。
本の装丁に言及する。見返しの紙の質感・テクスチャ―が非常にいい。落ち着いていて、品がある。格子の凹凸がある、布目のようなこのような紙が、 どのような名前で呼ばれるものか、ぜひ知りたい。
わたしは Java を知らないので、残念ながら著者らが求めている読者像から外れる。しかし、一応 C 言語には慣れているから、読者として許してもらおう。
本書の「はじめに」の「本書の構成」の項では次のように書かれている。
(前略)Scala に慣れていない人(つまり本書の主要な読者ですが)はとりあえず前から読んでいくのがよいでしょう。 一方で(第 2 章を除いて)各章の内容自体は比較的独立性が高いため、一度ざっと眺めたあと、必要に応じて各章の内容をつまみ食いするというのもありだと思います。 通読にこだわるあまり書籍を活用できなくては本末転倒ですので、うまく「斜め読み」をすることがいいのではないかと考えています。(後略)
一度ざっと眺め
る前につまみ食いする私は、やはり本書の読者としては不適格なのだろう。
私は、scala 3.2.2 で本書にある例を試した。 コマンド scala で scala のソースコードを読み込ませても本書とは異なりエラーが出る。 本書の p.19 の最初のコードブロックは次のとおりである。
$ echo 'println("Hello World!")' > hello.scala $ scala hello.scala Hello World!
ところが私の環境ではエラーが起きる。
PS C:> scala .\hello.scala -- [E103] Syntax Error: C:hello.scala:1:0 1 |println("Hello World!") |^^^^^^^ |Illegal start of toplevel definition | | longer explanation available when compiling with `-explain` 1 error found Errors encountered during compilation
これは、Scala 3 で起きる。このエラーを防ぐには、本書の scalac の書き方によるか、次のように @main を用いる。
$ echo '@main def hello() = println("Hello World!")' > hello.scala $ scala hello.scala Hello World!
参考 https://docs.scala-lang.org/scala3/book/methods-main-methods.html
p.064 の2番目のコードブロックを次のように 1 行だけ付け足して scala の REPL で実行させたがエラーになる。
@main def main(args: String*) =
val oneTwo = List(1, 2)
val threeFour = List(3, 4)
val oneTwoThreeFour = oneTwo ::: threeFour
println(oneTwo + " and " + threeFour + " were not mutated.")
println("Thus, " + oneTwoThreeFour + " is a new list.")
エラーは下記のとおり。
PS C:> scala .\listInitialize.scala -- [E008] Not Found Error: C:listInitialize.scala:5:17 5 | println(oneTwo + " and " + threeFour + " were not mutated.") | ^^^^^^^^ | value + is not a member of List[Int] 1 error found Errors encountered during compilation
これは、変数 oneTwo が文字列型になりきれていないから起こるのだろう。Ruby だったら .to_s メソッドをつけて文字列化するのだが、 Scala ではどうするのだろうか。https://scala-lang.org/api/current/scala/collection/immutable/List.html を見ると toString()メソッドがあるようだから、これを使うのだろうか。プログラムを一か所だけ書き直した。
@main def main(args: String*) =
val oneTwo = List(1, 2)
val threeFour = List(3, 4)
val oneTwoThreeFour = oneTwo ::: threeFour
println(oneTwo.toString() + " and " + threeFour + " were not mutated.")
println("Thus, " + oneTwoThreeFour + " is a new list.")
実行結果は下記の通り。
PS C:> scala .\listInitialize.scala List(1, 2) and List(3, 4) were not mutated. Thus, List(1, 2, 3, 4) is a new list.
意図した結果が得られた。
https://gihyo.jp/book/2018/978-4-297-10141-1/support#supportApology になかった誤植は次の通り。
場所 | 誤 | 正 | 備考 |
---|---|---|---|
p.28 2 つめのコードブロック 5 行目 | else { | } else { | |
p.32 下から 6 行目 | 以下ように for 式で書く方が | 以下のように for 式で書く方が | 行の位置はコードブロックを除く |
書名 | 実践 Scala 入門 |
著者 | 瀬良和弘、水島宏太、河内崇、麻植泰輔、青山直紀 |
発行日 | 2018 年 11 月 10 日 初版第 1 刷 |
発行元 | 技術評論社 |
定価 | 3280 円(税別) |
サイズ | A5 版 |
ISBN | 978-4-297-10141-1 |
その他 | 越谷市立図書館にて借りて読む |
まりんきょ学問所 > コンピュータの部屋 > Scala > 瀬良和弘、水島宏太、河内崇、麻植泰輔、青山直紀:実践 Scala 入門