From: NAGAI Hidetoshi Date: 1998-04-14T12:13:33+09:00 Subject: [ruby-dev:2303] Re: cmp operator 永井@知能.九工大です. >>>>> "F" == Tadayoshi Funaba writes: F> Struct でも indexes/indices といって構わないような気がするけど、それは F> どうなのか、 ということと、逆に Array や Hash で Struct#set_slice のよ F> うなものはありえるのか、ということをちょっと考えてみたくなりました。 indexes/indices では代入の機能がないため, 機能的な識別のために slice というのを使っていました. しかし,考えてみると indexes/indices の機能を拡張して, 1 引数の場合は現在の indexes/indices と同じ, 2 引数またはイテレータとしての呼び出しの場合は代入実施 というようにする選択もありそうです. こうしてまとめても,戻り値はすべての場合で 元々の indexes/indices の場合と同じに考えていいですから, 戻り値には問題なしですよね. 単純な要素抜き出しの indexes/indices は,現状にに比べ, 条件判断分の負荷が増えることになりますが... F> もし、名前でメンバを参照することが許されるなら、 self["名前"] ができて F> もよさそうです。そして、indexes/indices が nth もしくは "名前"を受けつ F> けることもできそうです (シンボルはひとまずおく)。 self["名前"] の場合はオブジェクトのタイプを検査することで, 確かに実現は可能だと思います. # Fixnum なら nth 参照,String なら "名前" 参照 いちいちタイプチェックをする分の手間はかかりますが. 「ひとまずおく」としているシンボルですが, もし将来的にはシンボルでもと考えるのであれば, シンボルは Fixnum となってしまいますから(ですよね?) 上記の方法は通用しないということになります. この場合は Struct で self[nth] という参照が定義されているのが ちょっと悩ましいところです.(^_^) シンボルでの参照というのは最初から捨ててかかるというのが やはり最も素直ということになるのでしょうか... F> というふうに、indexes/indices を基本にして、 Struct#set_slice のような F> ものも、もしそれが有用なら、それに対応するようなものとしてあるとよいよ F> うな気がします。 機能の統一性として,Array , Hash , Struct で同じ機能の indexes/indices を持たせるというのは「あり」だと思いますが, 本当は Array については代入までは不要だろうなと思ってます. 元々は,データ構造を扱う際に,要素のまとまりを まとまりのままに扱える *単純な* メソッドが欲しいなと考えてのことでした. 現状では,Struct でデータ構造を定義したとしても, 値の変更は要素一つ一つに対して個々に実行せねばならず,不便ですよね. 要素に「名称」の付かない Array の場合にはなくてもいいというか, それが必要になるプログラムの仕方自体が悪いと考えるべきでしょう. # Hash の key を名称代りに用いることも # あまり勧められた方法ではなさそうですが.(^_^) Hash の場合は全体を replace することができますから, 階層を持つデータ構造にして,まとまりごと置き換える方法があります (新たにオブジェクトを生成する分は無駄な気もします)が, Struct ではそのようなことができるメソッドもないようです. 全体を一気に設定できるのは,new の時だけですよね? その要素全体を置き換えるメソッドがあれば, 階層化することによって問題の大部分はカバーできそうな気も しないではありません. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp