Scala の enum についての議論
JavaのからScalaに来て困ることは、自分の場合、Enumerationがイマイチなところくらいかな... あ、あとコンパイルが遅いことw
2010-06-04 13:00:40@keisuke_n そうですね。あと直列化すると、エンクロージングクラスまでいっしょに直列化されるので、バカみたいにサイズが大きくなったり。
2010-06-04 13:04:25@keisuke_n たしかにScala的には、enumよりも、case classでパターンマッチの方が合いそうですね。クラス数が増えるけど。
2010-06-04 13:14:30@ruimo ええcase classはまたニュアンスが違いますが、代用はできますね。case classでもcase objectでもたんなるobjectでも使えるので好みのものでw。Enumerationほど困ることはないですから。
2010-06-04 13:16:16@keisuke_n 永遠に掘っていけるようにしてしまうか、リンクみたいにして最初に出現した場所にジャンプする感じですかね。前者は、ちょっと気持悪いかな...
2010-06-04 13:31:33@take0123 そうですね、そういう言語もありますね。最近の言語は分けないことが多いですけど。関数型言語に少しでも触れて理解した方はやはり返り値をつけたがります。返り値がない=副作用があるとほぼ等価だからですけど...
2010-06-04 13:42:27@keisuke_n どういう場合ですか?普通はscala.Enumerationの値はmatchで使えるはずですけど。 http://gist.github.com/424971 #scala
2010-06-04 13:52:25@kmizu 今から出かけるので手短に言うと、問題あるケースがあった(思い出せない)のと、あと型付けの問題。特定の型になってくれない問題は不自由に感じます。
2010-06-04 14:00:30@keisuke_n 特定の型になってくれないということはないですよ。Enumerationを継承したクラスのValueというメンバ型でOKです。 #scala
2010-06-04 14:01:27@keisuke_n たとえば、object X extends Enumeration { ... } なら、X.Valueという型でその列挙型のみを受け入れる型になります。 #scala
2010-06-04 14:02:09@keisuke_n んー。よくわからないです。X.ValueでJavaでenum X { ... }に対してXという型を書いたのとほぼ同等になると思うのですが…。もしかして、Javaから利用するときのはなしですか?
2010-06-04 14:05:34まぁようするにJavaのようなenumが欲しいということですね。基本的に定数なんで動的に解決して欲しくない。
2010-06-04 14:07:16@yasushia 一応、object Cons { def unapply[T](list: List[T]): Option[(T, List[T])] = ... } というextractor作ればいけますけど、たぶんそういう意味ではないですよね。 #scala
2010-06-04 14:09:03@keisuke_n いや、動的に解決というか、valですから静的に解決されますよ。少なくともJavaのenumと同じ程度には。 #scala
2010-06-04 14:09:56@kmizu とにかくいまだとlazy valやvalなどの挙動の違いで使えないケースを結構経験しています。特に継承された型で発生していて、今のままでは使えないですね。
2010-06-04 14:10:22@keisuke_n うーん。静的の定義が食い違ってるような。ScalaのEnumerationが動的に解決されてるというなら、同じ程度にはJavaのenumも動的ですよ。あれって、内部的にはオブジェクトアロケートしてstaticフィールドに入れてるだけですから。 #scala
2010-06-04 14:12:04