「Scalaではじめるプログラミング(工学社)」の感想

ふふふふふ(´・ω・`)例のあの本じゃなくて、この本↓ですよ

  • 題が「Scalaではじめるプログラミング」だし、それとまえがき読むかぎり、「Scala」が主というより、「プログラミングをはじめる」のが主で、それにたまたま(?)Scala使う場合って感じなんでしょうか?
  • インストールに関しては、(完全にWindows前提だが!!)丁寧に書いてあっていいと思います

19ページ

UTF-8」というコードで、「BOM」(Byte Order Mark)なしでなくてはならない

オプションつければ、べつにUTF-8以外でもいいんですが・・・?まぁ二の舞ですね
http://d.hatena.ne.jp/kmizushima/20100222/1266771623

22ページ

Scala」では「プログラム(スクリプト)」で日本語を使うことができるが、「インタープリタ」で日本語を表示するには、起動するときにオプション「-Xnojline」を付ける必要がある。オプションを付けないで起動すると、日本語部分の入力や実行結果が文字化けする。

Linuxとかなら、文字化けしませんよ!あとWindowsでも、表示は文字化けしないはずです。それと、日本語入力したいときだけ、一度エディタで書いてから、「Ctrl + V」で貼りつければ、「-Xnojline」のオプション指定せずに「補完が有効な状態のまま」貼りつけできます。

「-Xnojline」のオプション指定しちゃうと、メソッド名の補完効かなくなるので、個人的には日本語入力のためにオプション指定するのはやめたほうがいいと思います。

23ページ

なお、「load」によって日本語を含む「スクリプト」を実行すると、日本語が文字化けするので注意されたい。これは「Scala」のバグと思われる。

本気でバグと思うなら、バグ報告するなり、パッチ送るなりすればいいんじゃないでしょうか?意味がわかりません

23ページ

さらに、オブジェクト名「Name」は「ソース名」と同じでなければならない。

そうなんですか、Scalaを1年半以上やってますが初めて知りました、すごいですね(棒
ScalaJavaとは違うんですよ?

25、26ページ

2.9なのに、Applicationトレイトつかってて、しかもREPL上で、

warning: there were 1 deprecation warnings; re-run with -deprecation for details

っていう警告でた画面のキャプチャが本に載っててワロタ

App使ってください(´・ω・`)

27ページ

コンパイラ」は任意のディレクトリから実行できる

コンパイラは名詞ですよね?まぁ単純なtypo ?

31ページ

Scala」の「プログラム」で用いられる「文字セット」(character set)は、「Unicode」(ユニコード)であり、日本語も一部で使用できる。

ここで言ってる「一部」でどういう意味で言ってるんだろう・・・?

32ページ

Scala」では、「識別子」は、英文字またはアンダースコア「_」で始まり、「英文字」と「数字」の並びが続くものである。

上記の説明自体は足りないだけで、間違ってはいないけど、わざとですよね?
英数字以外も混ぜることはできます。(その場合、ちょっとめんどくさい決まりがありますが)

また、「$」(ドル記号)も、「コンパイラ」との関連で「識別子」の中では使えない。

(内部クラス名や、記号メソッドが置き換わる場合に出てくるため)推奨はされてませんが、一応つかえますよ?

42ページ

「文」(statement)は、「命令」を表すものであり、「定義」「表現」は「文」になる。なお、「文」は空の場合もある。
複数の「文」をまとめたものは、「ブロック」(block)と言い、「{」と「}」で囲まれる。「ブロック」は、0個以上の文を含む。
また、1行の複数の「文」はセミコロン「;」で区切られる(最後の「文」の末尾の「;」は省略可能)。
なお、1つの「ブロック」は、2個以上の「宣言」や「定義」を含むことはできない。

なんかよくわからん。どこからつっこめばいいの?(´・ω・`)

52 〜 57 ページ

ビット演算とか妙に詳しい・・・けど、個人的にはもっと他のことを載せて欲しい

62ページ

「if」は「else」以下でネスト(入れ子)することによって、3個以上の処理を選択させることができる。

と書いてあるんですが、確かにできますが、

if(a){

}else if(b){

}else{

}

っていう形式を紹介しないのはなぜ・・・?あと、ifが値返すこと書いてない・・・?

63 ~ 66ページ

match式が、ほぼJavaのswitch文相当の機能のみの説明。match式というか、パターンマッチ自体は、完全に説明するのは大変なので、まぁここはわざと手続き型の使い方のみ説明してるんでしょうかね・・・
その他、 val や var の束縛や、無名関数の引数部分でのパターンマッチの説明はありませんでした

67ページ

for(enumerator)
expr


ここで、「enumerator」は「列挙子」(enumerator)を表わし、「expr」は「表現」を表す。exprが複数の文の場合には、「{」と「}」で囲む。

え〜と for( i <- 1 to 10 ; j <- 10 to 20 )println(i,j) っていう「(」と「)」で囲った書き方もできますよ。

上記の引用した箇所への指摘は適切でないというか、完全に自分の勘違いでした。もうしわけありませんm(_ _)m

そして、for式に関しては、まぁ全部書くのも難しいかと思いますが、「本当はもっといろんな機能あって、そもそもループのための構文じゃないんだよ」的なことを一言でもいいから書いておいてもらわないと、この前のような、勘違いする人が増えるので・・・
yieldも「ifガード」もまったく出てこなくて、本当にループとしての使い方のみ載ってました。

68ページ とか 70ページとかその他多数

object prog13{
 def main(args: Array[String]){
  println("整数 n (n>=1) を入力してください")
  var n = readInt()
  var sum = 0
  var i = 0
  for (i <- 1 to n) {
   sum = sum + i  
  }
  println("sum = "+sum)
 }
}

forの前のiは何のためにあるんでしょうかね・・・まさか(ry

73ページ

「配列」(array)は、同じ「型」の「要素」(データ)を並べた「データ型」であり、基本的には、「1次元配列」と「2次元配列」がある。

ここでの「基本的」という言葉の意味とか意図はなんだろうか

74ページ

object prog16{
 def main(args: Array[String]){
  var a = Array(1,2,3,4)
  for(i <- 0 to a.length-1) {
   println("a("+i+") = "+a(i))
  }
  var sum = 0
  for(i <- 0 to a.length-1) {
   sum = sum + a(i)
  }
  println("sum(a(i)) = "+sum)
 }
}

0 to a.length-1
とかやるなら(しかも何度も)せめてuntilメソッド出して説明してもいいんじゃ・・・それとここから数ページ、C言語的な配列の使い方が*1続くんだが・・・もっとこうなんか・・・(´・ω・`)

78ページ

「2次元配列」の宣言方法は、2通りある。最初の方法は、「new」と「Array」を用いる。

aname = new Array[Array[type]](n)(m)

次のページで、

  var a = new Array[Array[Int]](n,m)

という記述が出てくるので、前者は単なる記述ミスかと思うんですが、どちらにしろ、new Array[Array[Int ] ](10,10)とかは非推奨で、2次元配列つくりたいなら

Array.fill(10,10)(0)

ですよ

100ページ

「例外」(esception)

typo

104ページ

なお、「catch{}」の部分は省略可能である。

なんか説明中途半端で、どうせなら、「catchがある場合はfinallyが省略可能」とかも書けばいいんじゃなイカ?
そもそもtry catchが値を返すことが書いてなかったり・・・なんかもうあれ(´・ω・`)

146ページ

private とか protected がでてきたところで、

「セキュりティ」などのように、特別な「アクセス制御」が必要な場合は、「アクセス修飾子」を用いる必要がある。本書では、そのような「プログラム」は扱わないので、「アクセス修飾子」は用いられていない。

*2

private とか protected って「セキュりティ」のためだったんですか・・・ェ・・・

147ページ

なお、「math」の代わりに旧仕様の「Math」も使用可能である。この場合、コンパイル時に警告メッセージが表示されるが、結果に影響はない。

・・・そうですね・・・Applicationトレイトとか、Arrayの生成もそうですが、警告とか気にしない寛大な(?)感じですね

161ページ

匿名関数とかの章で、

Scala」では、「関数適用」は「apply」で記述される

関数のオブジェクトに対して、applyを明示的に呼び出せってことなのか・・・?省略記法というか、apply自体のシンタックスシュガーに触れてない・・・?
その数行後

なお、「apply」は名前を持つ「関数」と「引数」の「適用」にも用いられる。
「apply」自体も「関数」であるが、「引数」として「関数」を取れる「関数」は、「高階関数」(higher-order function) と言う。

「匿名関数」は「関数型プログラミング」の基本的な手法であり、さまざまな用途に用いられる。もっとも重要な利点は、「関数」の定義を簡略化できることである。

ここで、(Functionクラスについてはまったく説明せずに)関数オブジェクトのapplyについて中途半端に説明して、なおかつ高階関数を説明する斬新な感じ!
その他いろいろと、どこからつっこめばいいの・・・(´・ω・`)

175ページ

「List」クラスは、「Java」の「String」クラスをベースにしている。

・・・そうだったんですか!?
単にimmutableということが言いたかったのか、なにか書き間違えたのかわからないけど、意味が分かりませんでした

 なお、異なる「型」の「要素」から構成される「リスト」を定義するには、「type」に「Any」を指定する。

Any型のList・・・Any型のList・・・!?((((;゚Д゚))))ガクガクブルブル

176ページ

リスト「L」のi番目の「要素」は、「apply(i)」で参照できる。

なんでそんなに明示的にapplyを呼びたいの・・・というか、シンタックスシュガーの説明ないの・・・まさか(ry

180ページ

L.sorted

によって、「L」は「昇順」にソートされる。
 なお、「降順」の「ソート」をするには、

L.sorted.reverse

まぁ間違ってないですが

scala> List(3,7,2).sortBy(- _)
res0: List[Int] = List(7, 3, 2)

っていう方法もありますよっと
コメントもらいました、Intなど、マイナスしてオーバーフローする場合は使えないですね。
何が言いたかったかというと、sortしてからreverseするのは遅いかもしれない?し、sorted以外にも、(Intを降順にする場合はマイナスしただけじゃ使えないですが)sortByとかsortWithとか色々方法あるよっていう話。*3
さらに後から追記

List(3,7,2).sortBy(Ordering.Int.reverse)

Orderingのオブジェクトに、標準で reverse というメソッドが付いているので、上記のように、Int型のOrderingオブジェクトをreverseしたものを明示的に渡すという方法もありますね。

その他全体を通して

  • とりあえず、(valにできるところでも)var がほぼ全体的に使われてる
  • インデントがスペース1だったり、
  • クラス名やメソッド名のつけ方が一般的な規約と違ったり
  • 変数の型が(ローカル変数でさえ)多くの場所で省略せずに書いてあったり*4

他にも色々言いたいことありますが疲れたのでもういいかな(´・ω・`)
まぁこういう本が出てくるほどに、Scalaも普及してきたってことなんですかね ゜*。・*゜゜*。・*゜ ヽ(*゚∀゚)ノ.・。*゜。・。*゜。

*1:2次元配列つかったりとか。1つのfor式で書けるのに、forがネストされてたりとか

*2:セキュりティの「り」が平仮名なのはママです

*3: マイナスするのではなく、 sortBy(~ _)っていうビット反転すれば、sortByつかえる・・・けど明らかに読みづらくて、何したいかパッと見わからないので、まぁやめたほうがいいですね

*4:型が省略できることの説明や、型推論の話は(ちょっとだけだが)でてきてはいたが