12/05/01 13:54:41.10
本当にやりたい事がthisコンストラクタを使って実現すべき事なのかどうかが
疑問だけど(設計が悪いんじゃないかしらということ)
計算自体を分離するなりすれば良いだけじゃないの?
object X {
def calc(a: Int, b: Int) = a * b + 10
}
class X (val i: Int) {
import X.calc
def this(a: Int, b: Int) = this(X.calc(a, b))
}
class Y (override val i: Int) extends X(i) {
import X.calc
def this(a: Int, b: Int) = this(X.calc(a, b))
}
19:デフォルトの名無しさん
12/05/01 14:21:26.61
class X(a: Int, b: Int) {
val i = a * b + 10
}
class Y(a: Int, b: Int) extends X(a, b)
scala> new Y(2, 3).i
res0: Int = 16
20:デフォルトの名無しさん
12/05/01 14:34:54.01
>>18, 19
ありがとう。
実際には scala 標準ライブラリのクラス (具体的には scala.collection.mutable.BitSet) に機能を追加したい。
protected なメンバにアクセスする必要があるので継承して子クラスを作るといいのかな、と。で、親クラスに 3 つあるコンストラクタを子クラスでもそのまま使いたいというシチュエーションです。
と思ったんだけど、 trait 作って new BitSet() with TraitA みたいにするのがいいのかな?その場合 companion object (BitSet) によるインスタンス生成時に trait くっつけることできないですよね。。
21:デフォルトの名無しさん
12/05/01 14:44:34.04
ライブラリなど既存のコードへの機能追加するときの有益な手法として
「Pimp my Library」パターンというものがあります。
つづきはWebで
22:デフォルトの名無しさん
12/05/01 14:50:42.82
"pimp"というスラングはもともと「売春の斡旋人。売春婦に依存して生活する男。」
へぇー
23:デフォルトの名無しさん
12/05/01 14:58:28.65
>>21
ググル先生に聞いて来ました。 RichInt とかのあれだったんですね。
Pimp my Library pattern, protected なメンバにアクセスできる?
24:デフォルトの名無しさん
12/05/01 17:57:57.08
case class について質問です。
case class X(x: Int)の実体X(1)は、参照数が0になってもGCが走るまでの間
は存続していると考えていいのでしょうか?
既にどこからも参照されていないX(1)を再び生成しようとした際、GCに消され
ていなければ実体生成コストを省けるのか?という点が知りたいです。
想定している状況は、自己再帰関数内で case class X への map を行うけど、
条件にmatchしなければ作ったX(_)を捨てて、次の再帰関数呼出時にまた作り
直すといったもので、キャッシュされていると嬉しいなと思ったのです。
(そもそも小さいインスタンスを大量生成してもコストは軽微だという話はど
こかで読んだ気がしますが。)
25:デフォルトの名無しさん
12/05/02 23:13:38.59
Memoizeしようという話か?
26:デフォルトの名無しさん
12/05/02 23:40:44.49
>>24
実体はGCが走るまで存続してるけど、再利用はされないよ。
そういうしくみはないし、たとえあってもペイしない。
27:デフォルトの名無しさん
12/05/03 00:33:08.36
>>26
Javaのプリミティブラッパーはキャッシュしてるし
登場頻度や生成量やGC/エスケープ解析の具合いによってはペイしないとも言い切れない
28:デフォルトの名無しさん
12/05/03 10:01:37.91
とりあえずなんでもかんでもcase classにしてしまう病を発症してるわ
29:デフォルトの名無しさん
12/05/03 11:51:53.66
自分でキャッシュしとけ
30:デフォルトの名無しさん
12/05/03 11:54:02.91
キャッシュでくれ
31:デフォルトの名無しさん
12/05/03 12:01:39.77
ほえ?
欲しいです!でもお金ないです!
32:デフォルトの名無しさん
12/05/03 12:04:04.37
つセコム
33:デフォルトの名無しさん
12/05/03 18:58:40.79
いま気づいたんだけど、REPLって前の実行結果(res*)が次の実行へ繋がってるんだね。
scala> List(1,2,3)
res1: List[Int] = List(1, 2, 3)
scala> .length
res2: Int = 3
地味に便利かも
34:デフォルトの名無しさん
12/05/05 09:51:39.68
>>11
あと、Cygwin のメリットとしては
A. Windows から直接 Cygwin 内の emacs が使える。Windows の
NotePad や WordPad は嫌だから。ファイル指定に cygpath コマンド使うのがコツ。
B. 仮想環境じゃないから Cygwin で作った OpenGL のプログラムが
高速表示可能。Scala だと、JOGL を Scala から使えるはず。
REPL から JOGL とかインタラクティブで面白そうだけど試したことない。
まあ、人それぞれかと。
35:デフォルトの名無しさん
12/05/05 12:34:33.26
僕はLWJGLちゃん!
36:デフォルトの名無しさん
12/05/05 23:49:03.24
>>35 情報ありがとう。
LWJGL は Nightly builds の lwjgl-2.8.4 なら Scala + 64bit JVM で
正常に動作した。Windows Professional 64bit だと 32bit JVM でも
2.8.3 は動作しなかった。情報ありがとう。lwjgl_test.jar のインベー
ダーゲームに感動したw (Java or Scala でもスピード出るね)
37:デフォルトの名無しさん
12/05/06 00:27:45.11
REPLでGUIってEDTで死ぬとばっかり思って試してなかった
38:デフォルトの名無しさん
12/05/06 12:13:07.02
lwjglお試しならgiter8でお手軽かんたんにできます
さんきゅーNicol (洞窟物語まだクリアしてないや