2010年6月5日

Scala の Enumeration について

@kmizu さんと @keisuke_n さんの Enumeration についての議論. @NetPenguin さんと @yasushia さんもちょっと関わっていたので発言を載せてあります.
2
NISHIMOTO Keisuke @keisuke_n

scala.Enumerationが静的に解決されないために、match-caseで使えないケースが多々あって困ったことがある。Javaのenumほどの文法はいらないが、ちゃんと定数であってほしい。

2010-06-04 13:04:34
NISHIMOTO Keisuke @keisuke_n

だからいつもは、sealed trait Hoge; Fuga extends Hogeとかやってお茶を濁すことが多い。

2010-06-04 13:08:01
NISHIMOTO Keisuke @keisuke_n

sealed *** なんとか; object かんとか extends なんとか; はまぁ記述としては短いし、型も保証されるからこれでいいんだけど、なんというかまぁ面倒なことには変わりない...

2010-06-04 13:10:11
NISHIMOTO Keisuke @keisuke_n

@ruimo とりあえず sealed trait Foo; object Boo extends Foo; ... を使うことが多いですね。これだと静的に解決されるので...。Javaのコードを使うのは私の場合はアノテーションを使うときですか。2.8で解決されるのかどうか...

2010-06-04 13:12:30
NISHIMOTO Keisuke @keisuke_n

@ruimo ええcase classはまたニュアンスが違いますが、代用はできますね。case classでもcase objectでもたんなるobjectでも使えるので好みのものでw。Enumerationほど困ることはないですから。

2010-06-04 13:16:16
Kota Mizushima (on a diet) @kmizu

@keisuke_n どういう場合ですか?普通はscala.Enumerationの値はmatchで使えるはずですけど。 http://gist.github.com/424971 #scala

2010-06-04 13:52:25
NISHIMOTO Keisuke @keisuke_n

@kmizu 今から出かけるので手短に言うと、問題あるケースがあった(思い出せない)のと、あと型付けの問題。特定の型になってくれない問題は不自由に感じます。

2010-06-04 14:00:30
Kota Mizushima (on a diet) @kmizu

@keisuke_n 特定の型になってくれないということはないですよ。Enumerationを継承したクラスのValueというメンバ型でOKです。 #scala

2010-06-04 14:01:27
Kota Mizushima (on a diet) @kmizu

@keisuke_n たとえば、object X extends Enumeration { ... } なら、X.Valueという型でその列挙型のみを受け入れる型になります。 #scala

2010-06-04 14:02:09
NISHIMOTO Keisuke @keisuke_n

@kmizu んー、それでは具合が悪いですね。

2010-06-04 14:03:29
Kota Mizushima (on a diet) @kmizu

@yasushia 残念ながら、そのものはちょっと無理でしょうね。case List(head, tail@_*) => ...だと、tailの型がSeqになってしまいますし。 #scala

2010-06-04 14:04:19
Kota Mizushima (on a diet) @kmizu

@keisuke_n んー。よくわからないです。X.ValueでJavaでenum X { ... }に対してXという型を書いたのとほぼ同等になると思うのですが…。もしかして、Javaから利用するときのはなしですか?

2010-06-04 14:05:34
NISHIMOTO Keisuke @keisuke_n

まぁようするにJavaのようなenumが欲しいということですね。基本的に定数なんで動的に解決して欲しくない。

2010-06-04 14:07:16
Kota Mizushima (on a diet) @kmizu

@yasushia 一応、object Cons { def unapply[T](list: List[T]): Option[(T, List[T])] = ... } というextractor作ればいけますけど、たぶんそういう意味ではないですよね。 #scala

2010-06-04 14:09:03
NISHIMOTO Keisuke @keisuke_n

@kmizu いまそれではダメだという例が出せないのでまた後で。

2010-06-04 14:09:19
Kota Mizushima (on a diet) @kmizu

@keisuke_n いや、動的に解決というか、valですから静的に解決されますよ。少なくともJavaのenumと同じ程度には。 #scala

2010-06-04 14:09:56
NISHIMOTO Keisuke @keisuke_n

@kmizu とにかくいまだとlazy valやvalなどの挙動の違いで使えないケースを結構経験しています。特に継承された型で発生していて、今のままでは使えないですね。

2010-06-04 14:10:22
NISHIMOTO Keisuke @keisuke_n

@kmizu いやいや、静的には解決されてませんよー。

2010-06-04 14:10:50
NISHIMOTO Keisuke @keisuke_n

以上の理由で私はEnumerationはまったく使わないです。

2010-06-04 14:11:52
Kota Mizushima (on a diet) @kmizu

@keisuke_n うーん。静的の定義が食い違ってるような。ScalaのEnumerationが動的に解決されてるというなら、同じ程度にはJavaのenumも動的ですよ。あれって、内部的にはオブジェクトアロケートしてstaticフィールドに入れてるだけですから。 #scala

2010-06-04 14:12:04
NISHIMOTO Keisuke @keisuke_n

@kmizu いやだからそうじゃないです。

2010-06-04 14:12:18
NISHIMOTO Keisuke @keisuke_n

まぁわかっていってるのでしょうけど。

2010-06-04 14:12:45
NISHIMOTO Keisuke @keisuke_n

とりあえず例が出てくるまでsuspend。

2010-06-04 14:13:15
Kota Mizushima (on a diet) @kmizu

@keisuke_n いや、これは本気でわからないので聞いています。scala.Enumerationには別の意味でイマイチな点はあるのですが、指摘されている点は何かズレているのでは、という疑問を持っています。 #scala

2010-06-04 14:13:59
NISHIMOTO Keisuke @keisuke_n

@kmizu いやだから本人も思い出せないといってます。ただ今確認しているのは、静的に見えるけど実は動的にインスタンスが生成されているので、タイミング的に不具合が生じるケースを実際に経験しています。まずソレ。

2010-06-04 14:15:05
残りを読む(153)

コメント

tomo🐧@learning @cocoatomo 2010年6月5日
とりあえず現時点までの議論をまとめてみました. 今後発生したものについても追加していきます.
0