2 式、型、値
- Scalaのメンタルモデルにおいて、式、型、値が基本的な構成要素
式
- 式は値に評価される
- 式は型をもつ
- プログラムテキストでコンパイル時に存在している
- プログラムテキストの構成要素としては、定義や文も存在する
型
- プログラム上の制限を表現する
- 値が一貫性をもって解釈されるようにプログラム記述を制約するもの
- コンパイル時に存在し、チェックする
- 型消去によって実行時には存在しない
scala> :type 2
Int
値
- メモリに保存した情報で実行時にのみ存在している
- 実行しているプログラムが操作の対象
- Scalaの値は全てオブジェクト
評価
- 左から右へ評価される
scala> "Hello World!"
res0: String = Hello World!
scala> "Hello World!".toUpperCase
res1: String = HELLO WORLD!
コンパイル
- コンパイル時には文法と型を検証
オブジェクト
- データと操作(メソッド)の組み合わせ
中置記法
- 引数が1つのメソッドは中置記法にできる
リテラル式
- プログラム実行前のプログラムテキストにおける表現
- 評価された値と混同しないこと: 値は プログラムを実行した後のメモリ上における表現
- 全てのリテラル式は型をもち、値に評価される
オブジェクトリテラル
- 記述する際は、式ではなく宣言を利用する
- 空のオブジェクトを宣言する例
- 値に評価されないが
Test
という名前に「空のオブジェクト」という値がバインドされるTest
を評価すると、Test.type
という型に評価されるTest.type
はこのオブジェクトのために作られた新しい型でシングルトン型と呼ばれる
scala> object Test {}
defined object Test // 定義される
scala> Test // 評価する
res4: Test.type = Test$@4b038836 //
フィールド&メソッド
- それぞれ名前に値をバインドする
- 宣言は式と異なり、値として評価されず、型も持たない
- フィールドは、オブジェクトにバインドした値を参照する
- メソッドは、値を生成する処理を参照する
- オブジェクトは遅延評価のため、参照されるまで評価されない
- フィールドの式は1回だけ実行され、結果がフィールドのバインドされる
- メソッドは参照される度に評価される ```scala scala> :paste object Test7 { val simpleField = { println(“Evaluating simpleFiled”) 42 } def noParameterMethod = { println(“Evaluating noParameterMethod”) 42 } } defined object Test7
scala> Test7 Evaluating simpleFiled res0: Test7.type = Test7$@481763b6
scala> Test7.simpleField res1: Int = 42
scala> Test7.noParameterMethod Evaluating noParameterMethod res2: Int = 42
scala> Test7.noParameterMethod Evaluating noParameterMethod res3: Int = 42
```scala