hpricot:Hpricot::Container::Trav#filter
さっぱり分からず…
>> require "hpricot" => true >> doc = Hpricot('<p>foo1</p><p>foo2</p>') => #<Hpricot::Doc {elem <p> "foo1" </p>} {elem <p> "foo2" </p>}> >> doc.filter {|x| x == "p"} NameError: undefined local variable or method `to_node' for #<Hpricot::Doc {elem <p> "foo1" </p>} {elem <p> "foo2" </p>}> from /usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/hpricot-0.8.2/lib/hpricot/traverse.rb:732:in `filter' from (irb):3 >> doc.filter {|x| true } NameError: undefined local variable or method `to_node' for {elem <p> "foo1" </p>}:Hpricot::Elem from /usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/hpricot-0.8.2/lib/hpricot/traverse.rb:732:in `filter' from /usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/hpricot-0.8.2/lib/hpricot/traverse.rb:724:in `filter' from (irb):4:in `each_with_index' from /usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/hpricot-0.8.2/lib/hpricot/traverse.rb:505:in `each' from /usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/hpricot-0.8.2/lib/hpricot/traverse.rb:505:in `each_with_index' from /usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/hpricot-0.8.2/lib/hpricot/traverse.rb:505:in `each_child_with_index' from /usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/hpricot-0.8.2/lib/hpricot/traverse.rb:721:in `filter' from (irb):4 >> doc.search("*").filter {|x| true } ArgumentError: wrong number of arguments (0 for 1) from (irb):5:in `filter' from (irb):5 >> doc.at("*").filter {|x| true } NameError: undefined local variable or method `to_node' for {elem <p> "foo1" </p>}:Hpricot::Elem from /usr/local/ruby-1.8.7/lib/ruby/gems/1.8/gems/hpricot-0.8.2/lib/hpricot/traverse.rb:732:in `filter' from (irb):6
Hpricot::Container::Trav#filter の定義は以下のようになっていた
def filter(&block) subst = {} each_child_with_index {|descendant, i| if yield descendant if descendant.elem? subst[i] = descendant.filter(&block) else subst[i] = descendant end else subst[i] = nil end } to_node.subst_subnode(subst) end end
to_node って何?ソースを grep してもそれっぽいものが出てこないのだけど