Scala Language チュートリアル
Scala言語を使い始める
サーチ…
備考
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
このコードを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
オブジェクトの本体全体が「メインメソッド」として扱われます。
遅延初期化
公式のドキュメントによれば 、
App
はDelayed 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
。
スクリプトとしての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
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のすべての機能が利用できます:関数、クラス、メソッドなどを定義することができます。
スカラクイックシート
説明 | コード |
---|---|
不変の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 { |
各リスト要素に対してexecute関数 | List(1,2,3).foreach { println } |
標準出力に印刷する | print("Ada Lovelace") |
リストを英数字でソートする | List('b','c','a').sorted |