なんか驚くことばっかりなんですが。Scala。

1) static?なにそれおいしいの?


 ということでstaticという概念がないらしい。
mainメソッドのクラスではclass ~ではなくobject ~ってかんじで宣言したのだけど、
このobjectって宣言したものはシングルトンが保証されるらしい。なにそれすげえ。
同名のclassとobjectの共存もできるっぽい。でもなんかそれやりたくない。できなくすりゃいいのに。


2) 変数宣言はvarとval


 ということで宣言の仕方が二種類。これはなんとなくいわれなくても空気読めたけど。
・var : ふつうの変数。再代入とか可能。
・val : final変数。

そして型推論があるので、
scala> var x = 3
x: Int = 3

scala> var x = "hoge"
x: java.lang.String = hoge

scala> x = 6
<console>:5: error: type mismatch;
found : Int(6)
required: java.lang.String
x = 6
^

かっけー(@ ̄Д ̄@;)

ちなみに型を明示して宣言したいときはx:Intみたいに右にくっつけてやるだけ。

あと、Scalaでは宣言時に初期化しちゃわないとだめみたい。
scala> val x:Int
<console>:4: error: only classes can have declared but undefined members
val x:Int
^

scala> var x:Int
<console>:4: error: only classes can have declared but undefined members
(Note that variables need to be initialized to be defined)
var x:Int
^


3) 関数と戻り値と


なんかPersonクラスとかでもしれっとやってたけども。
こういう感じ。
def 関数名(引数名:型[,引数名:型...])[:戻り値型]{
処理
}

例によって例のごとく戻り値の型は省略できる。

実際はこんなん。
scala> def hoge(x:Int,y:Int) = {x+y}
hoge: (Int,Int)Int

scala> hoge(8,9)
res10: Int = 17


  |l、{   j} /,,ィ//|     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  i|:!ヾ、_ノ/ u {:}//ヘ     | あ…ありのまま 今 起こった事を話すぜ!
  |リ u' }  ,ノ _,!V,ハ |     < 『おれは関数の最後でreturnしなかったと
  fト、_{ル{,ィ'eラ , タ人.    |  思ったらいつのまにかIntの値が返ってきた』
 ヾ|宀| {´,)⌒`/ |<ヽトiゝ   | 催眠術だとか超スピードだとか
  ヽ iLレ  u' | | ヾlトハ〉.   | そんなチャチなもんじゃあ 断じてねえ
   ハ !ニ⊇ '/:}  V:::::ヽ. │ もっと恐ろしいものの片鱗を味わったぜ…
  /:::丶'T'' /u' __ /:::::::/`ヽ \____________________

いったいどういうことなの・・・

Scalaではreturnすら省略可能らしい。
省略した場合、最後に評価した式の値が返ってくる

これは、Scalaでは関数は必ず戻り値を持つことを保証しているから。
(ちなみに関数型言語ってのはそうらしい。)

となると・・・戻り値voidはどーなるの?
その場合は、Unit っていう「値ではない」値を返すんだと。(°д°;)

Java屋さんは、とりあえずこのUnitをまあvoidだと思ってだまされろと。
うーん、勉強になるなあ。。。

ちなみにreturnは省略可能ってだけで、Javaとおんなじように使えるらしい。
scala> def hoge(x:Int,y:Int) = {return 6}
<console>:4: error: method hoge has return statement; needs result type
def hoge(x:Int,y:Int) = {return 6}
^


なんだよ!エラーになったじゃねえか!ヽ(`Д´)ノ

scala> def hoge(x:Int,y:Int):Int = {return 6}
hoge: (Int,Int)Int

scala> hoge(3,1)
res11: Int = 6


return使いたいときは戻り値の型を明示してやんないといけないみたい。