From: nobu.nakada@... Date: 2002-02-25T13:02:40+09:00 Subject: [ruby-dev:16061] Re: New Struct なかだです。 At Mon, 25 Feb 2002 12:31:28 +0900, Shin-ichiro HARA wrote: > で、こんなのが組み込みクラスであったら(Struct と呼べないか > もしれないが)いいと思いません? > > foo = Struct.new(:name => "matz", :age => 104) > p foo.type #=> Struct > p foo.name #=> "matz" > p foo.age #=> 104 # 年くいすぎ。:) > もちろん name, age は特異メソッドで。 ostructがすごくそれっぽいような気がします。 そういえば、しばらく前にOpenStructでSymbolをキーに使えるように してみたのがありました。 Index: ostruct.rb =================================================================== RCS file: /cvs/ruby/src/ruby/lib/ostruct.rb,v retrieving revision 1.1.1.1 diff -u -2 -p -r1.1.1.1 ostruct.rb --- ostruct.rb 1998/01/16 12:19:17 1.1.1.1 +++ ostruct.rb 2002/01/10 11:04:36 @@ -9,47 +9,50 @@ # p s -class OpenStruct +class OpenStruct < Hash + class << self + alias [] new + end + def initialize(hash=nil) - @table = {} if hash - for k,v in hash - @table[k] = v - end + hash.inject(self) {|s,(k,v)| self[k.intern] = v} end end def method_missing(mid, *args) - mname = mid.id2name len = args.length - if mname =~ /=$/ - if len != 1 + if (mname = mid.to_s).sub!(/=\z/, '') + unless len == 1 raise ArgumentError, "wrong # of arguments (#{len} for 1)", caller(1) end - mname.chop! - @table[mname] = args[0] + ret = self[mname.intern] = args[0] elsif args.length == 0 - @table[mname] + ret = self[mid] else raise NameError, "undefined method `#{mname}'", caller(1) end + mname = mname.intern + class << self; self; end.class_eval do + define_method(mname, proc {self[mname]}) + define_method("#{mname}=", proc {|v| self[mname] = v}) + end + ret end - - def delete_field(name) - if name.type == Fixnum - name = name.id2name + + def delete(name) + class << self + remove_method(name.to_s) + remove_method(name.to_s+"=") end - @table.delete name + super name.intern end + alias delete_field delete def inspect str = "<#{self.type}" - for k,v in @table - str += " " - str += k - str += "=" - str += v.inspect + for k,v in self + str << " #{k}=#{v.inspect}" end - str += ">" - str + str << ">" end end -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦