Scala LanguageScala言語を使い始める


備考

Scalaは、一般的なプログラミングパターンを簡潔でエレガントでタイプセーフな方法で表現するために設計された、最新のマルチパラダイムプログラミング言語です。 オブジェクト指向言語と関数型言語の機能をスムーズに統合します。

ほとんどの例では、Scalaのインストールが必要です。 これはScalaのインストールページです 。これは「Scalaの設定方法」の例です。 scalafiddle.netは、Web上で小さなコード例を実行するための優れたリソースです。

バージョン

バージョン発売日
2.10.1 2013-03-13
2.10.2 2013-06-06
2.10.3 2013年10月1日
2.10.4 2014-03-24
2.10.5 2015-03-05
2.10.6 2015-09-18
2.11.0 2014-04-21
2.11.1 2014-05-21
2.11.2 2014-07-24
2.11.4 2014-10-30
2.11.5 2014-01-14
2.11.6 2015-03-05
2.11.7 2015-06-23
2.11.8 2016-03-08
2.11.11 2017-04-19
2.12.0 2016年11月03日
2.12.1 2016-12-06
2.12.2 2017-04-19

スクリプトとしてのHello World

Scalaはスクリプト言語として使用できます。デモを行うには、次の内容のHelloWorld.scala を作成します。

println("Hello")
 

コマンドラインインタプリタで実行します( $ はコマンドラインプロンプトです)。

$ scala HelloWorld.scala
Hello
 

.scala (単にscala HelloWorld と入力した場合など)を省略すると、ランナーはコンパイルしてスクリプトを実行するのではなく、バイトコードでコンパイルされた.class ファイルを探します。

注意: scalaがスクリプト言語として使用されている場合、パッケージは定義できません。

bash などのシェル端末を使用するオペレーティングシステムでは、Scalaスクリプトは 'シェルプリアンブル'を使用して実行できます。 HelloWorld.sh という名前のファイルを作成し、次の内容をコンテンツとして配置します。

#!/bin/sh
exec scala "$0" "$@"
!#
println("Hello")
 

#! 間の部分#! !# は「シェルプリアンブル」であり、bashスクリプトとして解釈されます。残りはScalaです。

上記のファイルを保存したら、そのファイルに「実行可能」権限を与える必要があります。シェルでこれを行うことができます:

$ chmod a+x HelloWorld.sh
 

(これはすべての人に許可を与えることに注意してください: chmod読んでもっと特定のユーザのために設定する方法を学んでください)。

これでスクリプトを実行できます:

$ ./HelloWorld.sh
 

「メイン」メソッドの定義によるHello World

このコードをHelloWorld.scala という名前のファイルに配置します。

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

ライブデモ

JVMによって実行可能なバイトコードにコンパイルするには:

$ scalac HelloWorld.scala
 

それを実行するには:

$ scala Hello
 

Scalaランタイムがプログラムをロードすると、 main メソッドを持つHello という名前のオブジェクトが検索されます。 main 方法はプログラムエントリポイントであり、実行されます。

Scalaには、Javaとは違って、オブジェクトやクラスのファイル名の後に命名する必要はありません。代わりに、 Hello というパラメータがコマンドscala Hello 渡されますscala Hello は実行するmain メソッドを含むオブジェクトを参照します。同じ.scala ファイル内にmainメソッドを持つ複数のオブジェクトを持つことは完全に可能です。

args 配列には、もしあれば、プログラムに与えられたコマンドライン引数が含まれます。たとえば、次のようにプログラムを変更することができます。

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello World!")
    for {
      arg <- args
    } println(s"Arg=$arg")
  }
}
 

それをコンパイルする:

$ scalac HelloWorld.scala
 

そしてそれを実行してください:

$ scala HelloWorld 1 2 3
Hello World!
Arg=1
Arg=2
Arg=3
 

アプリを拡張してHello World

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

ライブデモ

App 特性を拡張することで、明示的main メソッドの定義を避けることができます。 HelloWorld オブジェクトの本体全体が「メインメソッド」として扱われます。

2.11.0

遅延初期化

公式のドキュメントによれAppDelayed Initializationという機能を利用しています。これは、メインメソッドが呼び出された後にオブジェクトフィールドが初期化されることを意味します。

2.11.0

遅延初期化

公式のドキュメントによれAppDelayed Initializationという機能を利用しています。これは、メインメソッドが呼び出された後にオブジェクトフィールドが初期化されることを意味します。

DelayedInit は一般的な使用で非推奨になりましたが、特別なケースとしてApp では引き続きサポートされています。置換機能が決定され実装されるまで、サポートは継続されます。

App 拡張するときにコマンドライン引数にアクセスするには、 this.args 使用しthis.args

object HelloWorld extends App {
  println("Hello World!")
  for {
    arg <- this.args
  } println(s"Arg=$arg")
}
 

使用するときはApp 、対象の身体のように実行されるmain 方法、オーバーライドする必要はありませんmain

スカラクイックシート

説明コード
不変のint値を代入する val x = 3
可変int値を代入する var x = 3
明示的な型で不変の値を代入する val x: Int = 27
遅れて評価された値を割り当てる lazy val y = print("Sleeping in.")
関数を名前にバインドする val f = (x: Int) => x * x
明示的な型を持つ名前に関数をバインドする val f: Int => Int = (x: Int) => x * x
メソッドを定義する def f(x: Int) = x * x
明示的な型指定を持つメソッドを定義する def f(x: Int): Int = x * x
クラスを定義する class Hopper(someParam: Int) { ... }
オブジェクトを定義する object Hopper(someParam: Int) { ... }
形質の定義 trait Grace { ... }
シーケンスの最初の要素を取得する Seq(1,2,3).head
スイッチ val result = if(x > 0) "Positive!"
最初のものを除くシーケンスのすべての要素を取得する Seq(1,2,3).tail
リストをループする for { x <- Seq(1,2,3) } print(x)
入れ子ループ for {
x <- Seq(1,2,3)
y <- Seq(4,5,6)
} print(x + ":" + y)
各リスト要素に対してexecute関数 List(1,2,3).foreach { println }
標準出力に印刷する print("Ada Lovelace")
リストを英数字でソートする List('b','c','a').sorted

Scala REPLの使用

追加パラメータなしで端末でscala を実行すると、 REPL (Read-Eval-Print Loop)インタプリタが開きます。

nford:~ $ scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_66).
Type in expressions for evaluation. Or try :help.

scala> 
 

REPLを使用すると、ワークシート形式でScalaを実行できます。実行コンテキストは保持され、プログラム全体を構築することなく手動でコマンドを試すことができます。例えば、 val poem = "As halcyons we shall be" と入力すると、次のようになります。

scala> val poem = "As halcyons we shall be"
poem: String = As halcyons we shall be
 

今、私たちはval を印刷することができます:

scala> print(poem)
As halcyons we shall be
 

val は不変であり、上書きできないことに注意してください。

scala> poem = "Brooding on the open sea"
<console>:12: error: reassignment to val
       poem = "Brooding on the open sea"
 

しかし、REPLではval 再定義することができます(同じスコープで実行された場合、通常のScalaプログラムでエラーが発生します)。

scala> val poem = "Brooding on the open sea"
poem: String = Brooding on the open sea
 

REPLセッションの残りの部分では、この新しく定義された変数は、前に定義された変数をシャドウします。 REPLは、オブジェクトや他のコードがどのように動作するかを素早く確認するのに便利です。 Scalaのすべての機能が利用できます:関数、クラス、メソッドなどを定義することができます。