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!") }