Scalaコップの会第0回、2章から3章1までででた質問、意見など

思い起こしながら書いているので、一部間違ってたり、そんなこと言ってないというのが混じってるかもしれないです。
あと、自分が聞いてた範囲だけです。

意外とつまずきが少なかったですね。
あと、当然というべきなのか、Javaがメインな方は、つまずくところがRubyistとは違う感じがします。


・returnいらないんだー。

//2.6foreachとforによる反復実行
args.foreach((arg: String) => println(arg)) //型を明示
args.foreach(arg => println(arg))           //型を省略
args.foreach(println)                       //関数リテラルの引数一個だから引数も省略しちゃう
for (arg <- args)
  println(arg)

Q. 上のforeachの"=>"とforの後の括弧内にでてくる"<-"の違いは?
A. foreachの"=>"以降は関数。javascriptとかでいうなら無名関数。println(arg)が無名関数の本体。argが関数パラメーター。右矢印で関数パラメーターargを無名関数に渡して処理という感じでどうでしょ。変数名は別にargでなくてもOK。
一方forの"<-"は、for arg in argsのinにあたる。for...in形式のループはシェルスクリプトとかActionScriptなどでもみかけますね。なので、この"<-"はfor式のシンタックスの一部です。


foreachのようなメソッドによる反復処理は、Rubyistにはお馴染みのものなんで、私はすんなり理解出来たんですけど、Javaの方にはやっぱり見慣れないもののようです。
でも、説明したら理解されたようです。自分がRubyのeachとかのブロックに初めて出くわしたときはもっと悶絶してた記憶が。

//3.1
val greetStrings = new Array[String](3)
greetString(0) = "Hello"
greetString(1) = ", "
greetStrings(2) = "world!\n"
for (i <- 0 to 2 )
  print(greetString(i))

Q.本文中の「greetStringの型はArray[String]であって、Array[String](3)ではないのである。」の意味がよくわからない。
A.不要な一文なのでは?この文章のせいでかえって混乱するよw


"0 to 2"は実際には 0.to(2) というメソッド呼び出しをこう書けるというもの。
0 がレシーバーで to がメソッド、 2 が引数。
同様にして、1 + 2 も 1.+(2) 。1 がレシーバ、+ がメソッド、2 が引数。
 +なんかの演算子もメソッドというのは、 Ruby と同じなのでわりかしすんなりなんですけど、0 to 2 という、ドットを省略出来る記法は、最初見たときぎょっとしました。+,-,*,/などでは、Ruby

//故にこんな書き方が可能
scala> 0 to 5 by 2
res3: Range = Range(0, 2, 4)
//↓こういうこと
scala> 0.to(5).by(2)
res5: Range = Range(0, 2, 4)

//うひょ
scala> 0 to 10 by 2 foreach(println)
0
2
4
6
8
10
//↓.や()、あと型も省略せずに書くとこう。
scala> 0.to(10).by(2).foreach((arg:Int) => println(arg))
0
2
4
6
8
10
//3.1
val greetStrings = new Array[String](3)
greetStrings.update(0,"Hello")
greetString.update(1, ", ")
greetStrings.update(2,"world!\n")
for (i <- 0 to 2 )
  print(greetString.apply(i))

Q.applyやupdateという糖衣構文はどうなったら適用されるとかどっかに書いてあるんですか?(質問者は私ですが、意図としてはPredef.scalaとかどこかにルールが書いてあるのかなと思った。)
A.コンパイラが解釈して変換する。id:xibbarさんのフォローで、個人的にはRubyのmethod_missing的な感じで捉えることにしました。
追記:あー、Rubyでいったら、for..inがeachのシンタックスシュガーみたいな話か。納得。あと、自動的に追加されてるコンストラクタみたいなもんってな話も出てたかと。理解力が落ちてる。


こんな所でしょうか?
Scalaは文法がかなりゆるく書けるのと文法が多いので、カオスに陥りやすいかもしれません。でもちょっとずつ覚えていけば、変な記法はないので、素直に読めるようになるという印象です。