My Brain is Open.

思いついたことを適当に列列と

ScalaでHello,world!

今更感がありますが、Hello,world!を自分なりに解説してみます。
サンプルコードはこちら。

// Hello.scala
object Hello {
  def main(args: Array[String]): Unit = {
    println("Hello,world!")
  }
}

Scalaでは次のようにスクリプト実行することもできます。(もちろん一度コンパイルするので遅いですが)

$ scala Hello.scala

object

object はstatic(静的)クラスに近いですが、同時にシングルトンインスタンスも生成します。
このサンプルではまだ違いが見えないと思います。

また、objectのアクセス修飾子がありませんが、scalaではpublicがデフォルトです。

def

メソッド定義です。mainメソッドは

引数 args(型 :Array[String]
返り値の型 Unit
実装 println("Hello,world!")

となります。

REPLなどでは以下のように実行できます。

scala> Hello.main(Array())

(なお、scalaコマンドで実行されるには、objectのmainメソッドが必須です。)

変数と型の指定

引数 args の指定方法にあるように、 Scalaでは変数名を前に、型指定を後に記述します。

val i: Int = 5
val s: String = "test"

サンプルコードのようにメソッド引数では型の定義が必須ですが、メソッドの返り値や初期値代入などの型推論できる状況では記述する必要のない場合があります。例えば先程の例は以下のように変数の型宣言を省略できます。

val i = 5 // scala.Int
val s = "test" // java.lang.String

Array[String]

String型の配列です。
ScalaではJavaの配列(String[])のようなものがなく、
配列(List)や連想配列(Map)、集合(Set)を扱う場合は通常 scala.collection パッケージを利用します。
ただし、Arrayはscalaパッケージで定義されており、scala.collectionパッケージには存在しません。
しかし、collectionパッケージにあるクラスと同じように操作ができるように作られています。

Unit

Unitはvoidと同じ役割のクラス(とオブジェクト)です。
voidを含め、char, int などのプリミティブ型は Scala では定義されておらず、Char, Int などのクラスで同等のものが定義されています。

println

標準出力に文字列を表示します。
特別な関数ではなく、scala.Predef.println というメソッドなのですが、
Scalaでは任意のスコープで

import scala._
import scala.Predef._
import java.lang._

が有効なため、printlnもそのまま使用できます。
参考 : http://www.scala-lang.org/api/current/index.html#scala.Predef$

省略形1

Scalaでは型推論などを利用して省略できる項目がいくつもあります。
最初は丁寧に返り値の方を明記したほうが無難だと思いますが、実装の短いメソッドの場合は必要ないことが多いです。

既にサンプルコードではreturnが省略されています。
printlnの返り値の型がUnitですので、return println("Hello,world!")でも同じ結果となります。
しかし、Scalaでは「最後に評価された返り値」がメソッドの返り値となるため、return は必要ありません。

型推論を使い、かつ、メソッドの実装が一文で終わる場合は以下のように省略できます。

object Hello {
  def main(args: Array[String]) = println("Hello,world!")
}

省略形2

scala.Appトレイトを用いると、objectの処理全体をmain関数として実行した状態に出来ます。

object Hello extends App { println("Hello,world!") }

ただ、こちらはスクリプト実行ではうまくいきません(原因は特定してませんが、Appトレイトの生成する内部クラスなどの関係でしょうか…?)
以下のように一度コンパイルしてから実行すると動きます。

scalac Hello.scala
scala Hello