ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

EMPTY_LISTとNil

2015-05-04 10:58:55 | PG(Scala)

Java・Scalaで何も無い事を表すキーワード』を書いたら、コメントを貰った。ライブラリーとキーワードを混同しない方がよいとのこと。

確かに空のリストと空のオプションを表すものについては、Javaでは実際によく使うメソッドの方を記載したので、異なって見えるかも。
というわけで、その部分の修正版。

JavaScala説明
EMPTY_LIST Nil 空のListインスタンス。
EMPTY None 空のOptionインスタンス。

JavaもScalaもどちらもライブラリーの一部なので、使い方は以下のような感じ。(Listの例)
どちらもキーワードっぽい使い方だ。 

JavaScala
import static java.util.Collections.EMPTY_LIST;
import java.util.List;
import scala.collection.immutable.Nil
import scala.collection.immutable.List
List<?> emptyList = EMPTY_LIST; val emptyList = Nil
@SuppressWarnings("unchecked")
List<String> emptyList = (List<String>)EMPTY_LIST;
val emptyList: List[String] = Nil
あるいは
val emptyList = Nil: List[String]
あるいは
val emptyList = Nil.asInstanceOf[List[String]]

ただ、これだと目的の要素の型を明示するのが不便なので、普通は以下のようにする。
どちらもメソッド呼び出しの使い方だ。

JavaScala
import java.util.Collections;
import java.util.List;
import scala.collection.immutable.List
List<String> emptyList = Collections.emptyList(); val emptyList = List.empty[String]

※今回のScalaの例ではJavaと対比させる為にimport文を明記したが、実際にはscala.collection.immutableパッケージのクラス(やオブジェクト等)は暗黙にインポートされているので、記述する必要は無い(というか記述しないのが普通)。
(それもあって、Nilはライブラリーという意識ではなく、キーワードと勘違いされるのかもしれないが^^;)


あと、冒頭に掲載した表では、JavaのOptionalについて「EMPTY」を載せた。
これは実際にOptionalクラスのソースに書かれている名前ではあるのだが、 可視性がprivateなのでEMPTY_LISTの様に直接使うことは出来ない^^;
そういう理由で、前回のブログではメソッド呼び出しの形式の方を書いた。

なお、空のオプションの記述方法は以下のようになる。(ScalaのNoneなんか出て来なーいw) 

JavaScala
import java.util.Optional; import scala.Option
Optional<String> emptyOption = Optional.empty(); val emptyOption = Option.empty[String]
String s = null;
Optional<String> emptyOption = Optional.ofNullable(s);
val s: String = null
val emptyOption = Option(s)
Optional<String> emptyOption = Optional.ofNullable(null); val emptyOption = Option(null: String)

※Scalaではscalaパッケージのクラス群は暗黙にインポートされるので、このimport文は記述しないのが普通。