2006-12-04
■ [ruby] define_methodで変なメソッド名が作れるんだが
Hpricotのソースを見てたら 意味不明な記述に遭遇。
 module Container::Trav
   def self.filter(tok, &blk)
     define_method("filter[#{tok.is_a?(String) ? tok : tok.inspect}]", &blk)
   end
   中略
   filter '@^=' do |attr,val,i|
      get_attribute(attr).to_s.index(val) == 0
   end
メソッド名が filter[@^=] とか、ありえないですよね。
irb(main):011:0> class Object; define_method("filter[@^=]"){ "asdffdsa" }; end
=> #<Proc:0x00002aaaabb5db68@(irb):11>
irb(main):017:0> 1.methods.find{|m| m=~/filter/}
=> "filter[@^=]"
と思いきや、普通に定義できたwww
irb(main):013:0> 1.filter[@^=]
SyntaxError: compile error
(irb):13: syntax error
1.filter[@^=]
         ^
       from (irb):13
呼び出しはもちろんsyntax error。
irb(main):014:0> 1.__send__("filter[@^=]")
=> "asdffdsa"
irb(main):015:0>
と思いきや、__send__使えば呼べるらしい。
define_methodで普通許されない名前のメソッドが定義できるのって仕様なんですかね?
[ツッコミを入れる]