bussorenre Laboratory

bussorenre Laboratory

Hello world in Scala

どんな事もまずは世界に挨拶することから始まる。

Scala で 雑に Hello World を書くとこうなる。

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

基本的にScalaJava class コードに変換されるので、JVM の制約を多少なりとも受ける。例えば、main(args: Array[String]) 型のメソッドを持つクラスをエントリーポイントに持つ等。

型定義は後置。Swift やgo も後置なので違和感はない。

Unit 型 というのは副作用のみを扱う関数(メソッド??)に付けられる型。このへんはまだ良くわかってないのでわかってきたタイミングで書く。

println, Array, String, Unit はどこで定義されて来ているのか?

Scalaパッケージメモ(Hishidama's Scala package/import Memo) によると、

名前 用途 備考
scala._ Scalaの基本クラス
scala.Predef._ 暗黙に使用できる関数が定義されているシングルトンオブジェクト Javaのstaticインポートに相当する方式でインポートされる。Predefに定義されているメソッドを関数として(オブジェクト名の指定なしで)使えるようになる。
java.lang._ Javaの基本クラス

が、自動的に(暗黙的に)import されていて、利用できる。

ScalaStandard Library によると、scala.Predef は

package scala
object Predef {

  // classOf ---------------------------------------------------------

  /** Returns the runtime representation of a class type. */
  def classOf[T]: Class[T] = null
   // this is a dummy, classOf is handled by compiler.

  // Standard type aliases ---------------------------------------------

  type String    = java.lang.String
  type Class[T]  = java.lang.Class[T]

  // 中略
  def println() = Console.println()
  def println(x: Any) = Console.println(x)

みたいな感じで記述されている。

$ scala helloworld.scala

で実行できる。スクリプト言語みたいな動作をする(多分実際には内部的にclass ファイルを作っているとは思うが)

クラスコードに変換して実行するには

# scalac helloworld.scala ではなく scala.helloworld.scala になってたのを修正しました
scalac helloworld.scala
scala HelloWorld