From: matz@... (Yukihiro Matsumoto) Date: 1997-11-18T16:04:11+09:00 Subject: [ruby-list:5323] Re: Questions on specs and threads まつもと ゆきひろです In message "[ruby-list:5322] Questions on specs and threads" on 97/11/18, Kazuhisa Yanagawa writes: | はじめまして. 読んでただけで今まで書いたことが無かったものです. はじめまして. | 1) case 文について | | case 文で when 節に配列を書くとマッチしません. whenには「when 1,2,3」というような書き方を許していますので, 配列の === を再定義することは考えていませんでした.検討して みます. | 2) typecase | | typecase のようなものはいりませんでしょうか? if-elsif-else-end で | 十分という意見は確かにあるのですが. 実はModule#===が再定義されているので,以下のような使い方が出 来ます. case obj when String ... when Object ... else ... end 1.1ではObject.typeを使って,別の書き方も出来ます. case obj.type when String ... when Object ... else ... end | 3) 記号的な記法 | | これは単なる私の趣味ですが, 単項インクリメントとかがたまに欲しく | なります. i += 1 でいいわけですが. i++ と書いて怒られる (^^; すんません.この件は以前から指摘されているのですが(演算子はC に似ているのに++と--は対応する演算子が無い),++の動作が本質 的に「変数を操作する」ものであるため,変数がオブジェクトでな いRubyでは導入できないでいます.++や--の「オブジェクト指向的 意味」がRubyの他の部分と整合性を保ったまま定義できれば採用し たいのですが…. | SR 風な(CSP 風な?) | | if condition1 | ... | [] condition2 | ... | [] else | ... | end | | なんてのも好きかもしれない. すいません.これどういう動作なんでしょう? CSPには弱くて…. # Betaもよく分かんなかったなあ. | 4) thread についての疑問 | | これは今までのとは何の関係もありませんが....最後に付けたようなス | クリプトがデッドロックします. 結局は Queue#push に変な引数を与え | るのが悪いのですが, なんで Wrong # of arguments(3 for 1) とかにな | らないのかが理解できません. これは「Thread内部で発生した例外は,デフォルトではそのthread を終了させて,外に通知しないから」でしょう.この動作そのもの は仕様です.で,それに対する対策は以下のいずれかです. * Thread#valueでthreadの終了をチェックする.例外で終了して いると例外を再発生させる * プログラムの先頭で「Thread.abort_on_exception = TRUE」と しておく,例外が発生した時点でプログラム全体が終了する. | 5) どこかに exception の一覧があったりしないでしょうか. TypeError と | RuntimeError ぐらいしか把握できなかったりするんですが. えーと,以前メール[ruby-list:881]で書いたきりどこにも載せて いませんドキュメントをそろえるのは今後の課題ですね.再掲して おきます. 現状のruby例外(大域脱出)一覧 GlobalExit すべての大域脱出の親 Fatal 捕捉できない Interrupt 割り込み SystemExit exitで発生 Exception 全ての通常例外の親 RuntimeError とくに限定なし SyntaxError evalでの文法エラー LocalJumpError 不正なbreak/next/redo.. TypeError 型が合わない ArgumentError 引数の数が合わない NameError 定義されていない名前を参照 IndexError インデックスが範囲外 NotImpError このOSでは実装されていない LoadError ロードするファイルが無い IOError sytem call以外のIOエラー EOFError EOFに出会った SocketError ソケットのエラー SecurityError safe.rbで定義されてる SystemCallError システムコールエラーの親 Errno::ENOENT ... * rescue節の後ろで例外の型を指定することで捕捉できる * rescueのデフォルトはExceptionを捕獲する * Fatal以外はrescueで明示的に指定することで捕獲できる * Fatalだけはどうやっても捕捉できない |# 大雑把に言って, active object の手抜きな実装....のプロトタイプ. |# Actor は send で送られて来たメッセージを disp でディスパッチしたい. これ結構面白いっすね. まつもと ゆきひろ /:|)