オブジェクト指向から関数型プログラミングへ『Scala 入門 (Essential Scala)』第1章 はじめに

[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) で公開されている [Essential Scala](https://underscore.io/books/essential-scala/) の [1 Getting Started](https://books.underscore.io/essential-scala/essential-scala.html#getting-started) を日本語訳したものです。日本語訳においてもライセンスは同じものを継承しています。毎日少しずつ翻訳を進めており、最新の日本語訳は [Scala 入門 (Essential Scala)](http://takuya0301.github.io/essential-scala.html) にあります。

原書：[underscoreio/essential-scala](https://github.com/underscoreio/essential-scala)
訳書：[takuya0301/essential-scala-ja](https://github.com/takuya0301/essential-scala-ja)

# ライセンス

Written by [Dave Gurnell](http://twitter.com/davegurnell) and [Noel Welsh](http://twitter.com/noelwelsh). Copyright [Underscore Consulting LLP](http://underscore.io), 2015-2017.
Translated by [Takuya Tsuchida](http://twitter.com/takuya0301). Copyright Takuya Tsuchida, 2020.
![CC BY-SA 4.0 logo](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)
This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.

# 目次

[序文](https://qiita.com/takuya0301/items/ddbe5493273d317cbb06)
[第1章 はじめに](https://qiita.com/takuya0301/items/6528b130f43dc5a3cb48)
[第2章 式・型・値](https://qiita.com/takuya0301/items/08e3101f84193f9e7346)
[第3章 オブジェクトとクラス](https://qiita.com/takuya0301/items/df373bf12a2560647c9e)
第4章 トレイトによるデータモデリング
第5章 シーケンス処理
第6章 コレクション
第7章 型クラス

# 第1章 はじめに

本書では、Scala コードの短い例を使って学んでいきます。それには2つの推奨される方法があります。（訳注：訳書において Scala IDE を使用する方法は非推奨です。理由は「Scala IDE を準備する」の節に記載しています。）

 1. **Scala コンソール (Scala console)** を使用する（コマンドラインが好きな人にはよいでしょう）

 2. **Scala IDE** の **ワークシート (worksheet)** を使用する（IDE が好きな人にはよいでしょう）

ここでは、それらを準備するための各工程を一通り説明していきます。

## Scala コンソールを準備する

[http://scala-lang.org](http://scala-lang.org) の手順に従って、コンピューターに Scala を設定します。（訳注：[日本語訳を読むにあたって推奨する事前準備](https://qiita.com/takuya0301/items/ddbe5493273d317cbb06#%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%A8%B3%E3%82%92%E8%AA%AD%E3%82%80%E3%81%AB%E3%81%82%E3%81%9F%E3%81%A3%E3%81%A6%E6%8E%A8%E5%A5%A8%E3%81%99%E3%82%8B%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99%E8%A8%B3%E8%80%85%E8%BF%BD%E8%A8%98)も参考にしてみてください。）一度 Scala がインストールされれば、コマンドラインプロンプトで `scala` と入力することで、対話的なコンソールを実行できるようになるはずです。これは macOS の例です。（訳注：内容を2020年現在のものに修正しています。）

```shell-session
dave@Jade ~> scala
Welcome to Scala 2.13.1 (OpenJDK 64-Bit Server VM, Java 1.8.0_242).
Type in expressions for evaluation. Or try :help.

scala>
```

`scala>` プロンプトで個々の式を入力し、**Enter** キーを押下することで、それらをコンパイルし、実行することができます。

```scala
scala> "Hello world!"
res0: String = Hello world!
```

### 一行の式を入力する

単純な式を入力してみましょう。

```scala
scala> 1 + 2 + 3
res1: Int = 6
```

Enter キーを押下したとき、コンソールは3つのことを応答します。

 - **識別子 (identifier)** `res1`
 - **型 (type)** `Int`
 - **値 (value)** `6`

次章で見ていくように、Scala のすべての式は **型** と **値** を持ちます。型はコンパイル時に決定され、値は式を実行するときに決定されます。ここでは、その両方が報告されています。

識別子 `res1` は、式の結果を将来の式の中で参照できるように、コンソールが提供する便利なものです。例えば、下記のように先ほどの結果を2倍することができます。

```scala
scala> res1 * 2
res2: Int = 12
```

有用な値を生成しない式を入力すると、コンソールは応答として何も印字しません。

```scala
scala> println("Hello world!")
Hello world!
```

ここで、`"Hello world!"` という出力は `println` という記述に由来しています。入力した式は実際のところ値を返しません。コンソールは上記で見た出力に類するものを提供していないのです。

### 複数行の式を入力する

簡単に複数行に渡る長い式を分割することができます。式が終わる前に Enter キーを入力すると、コンソールは次の行に継続していることを示す `|` という文字を印字します。

```scala
scala> for(i <- 1 to 3) {
     |   println(i)
     | }
1
2
3
```

一度に複数行の式を入力したいことがあります。このような場合、`:paste` コマンドを使用することができます。単純に `:paste` と入力し、Enter キーを押下し、コードを記述もしくはコピー＆ペーストしてください。すべてを入力し終わったら `Ctrl+D` を押下してください。通常のようにコードのコンパイルと実行がされます。

```scala
scala> :paste
// Entering paste mode (ctrl-D to finish)

val x = 1
val y = 2
x + y

// Exiting paste mode, now interpreting.

x: Int = 1
y: Int = 2
res6: Int = 3
```

ファイルに Scala コードがあるのであれば、ファイルの内容をコンソールの中に貼り付けるために `:paste` を使用できます。これは、コンソールに式を再入力するよりはるかに便利です。例えば、`1 + 2 + 3` を含む `example.scala` という名前のファイルがあるとき、下記のように `:paste` を使用できます。

```scala
scala> :paste example.scala
Pasting file example.scala...
res0: Int = 6
```

### 式の型を印字する

コンソールを使用する上での最後のテクニックです。時々、式を実際に実行せずに、その**型**を知りたいことがあります。それをするために、`:type` コマンドを使用することができます。

```scala
scala> :type println("Hello world!")
Unit
```

コンソールは、この式の `println` という記述を実行しないことに注意してください。コードをコンパイルし、この場合は `Unit` と呼ばれる何らかの型を印字しているだけです。

Scala の `Unit` は Java や C の `void` と同じです。詳細は第2章を読んでください。

## Scala IDE を準備する

---

#### :warning: Scala IDE は非推奨です（訳者追記）

Scala IDE は、2018年1月に 4.7.1 RC3 がリリースされたのを最後に更新がありません。そのため、訳書においては Scala IDE の利用を非推奨とし、本節を翻訳していません。

なお、Scala の IDE としては [IntelliJ IDEA](http://www.jetbrains.com/idea/) が主流になっています。**ワークシート**の機能もありますので、IDE を利用したい場合は IntelliJ IDEA をインストールすることで代替できると思います。しかし、訳書においては Scala コンソールでのみ検証しておりますので、Scala コンソールの利用を強く推奨します。

---