[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 03/27 01:12 / Filesize : 247 KB / Number-of Response : 962
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【Lua】組み込み系言語総合 その2【Squirrel】



40 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 15:34:28 ]
>>39
あー、なんかわかった。俺の理解はおかしかった

>あと、メタメソッドは機構上、必ずインスタンスに張り付いてるそれが呼び出されるようで、
>メタメソッドを上書きしてから親クラスのそれをよびだそうとしても自分のそれが
>呼び出されて無限ループになるって罠もあったり <はまった
これ間違い

メタメソッドは登録時に特殊処理されてて、クラスオブジェクト内の専用のテーブルに格納されてて、
メソッドとしてそもそも生えてない模様。 (class オブジェクトの _metamethods につっこまれてる)
クラスオブジェクトにメソッドが生えてないから、当然インスタンス側にもコピーされてきてない。
インスタンスでのメタメソッド呼び出し処理は、VM内から直接クラスオブジェクト内の _metamethods を見に行ってる

こんなかんじで呼び出そうとしてたんだけど(ちょっとうろおぼえコード)
function _get(name) {
if (自前処理) {
return XXX;
} else { // みつからないので親に投げる
return Parent::_get(name);
}
}

1. Parent::_get はそもそも存在してない(メタメソッドなのでクラスにも生えてない)
2. Parent::hoge のようなクラスメソッド呼び出しは、VM側がコンテキストをすり替えて this コンテキストで呼び出し開始されてる
3. 存在してないから今のコンテキストの _get が "_get" を探すために呼び出し開始される
4. 無限ループ
こんなオチではないかと

そちらのほうだと、Point::_add() をよびだそうとした時点で同じことがおこってるんじゃないかな。たぶん。
その先がちょっとわからんのだけど、もしかしたら SqBind がさらにテーブルから検索して呼び出すとか
そういう処理が入ってたりするのかな?
どちらにしても大変気持ち悪いことになってるってことになるんじゃないかと…






[ 続きを読む ] / [ 携帯版 ]

全部読む 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<247KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef