测试不是数组吗?如果不是,我该如何制作它?
test
将是NodeSet
:
Nokogiri::XML('<xml><foo/></xml>').xpath('//foo').class
=> Nokogiri::XML::NodeSet
foo = Nokogiri::XML('<xml><foo/></xml>').xpath('//foo')
=> [#<Nokogiri::XML::Element:0x8109a674 name="foo">]
foo.is_a? Array
=> false
foo.is_a? Enumerable
=> true
要将其转换为数组,请使用to_a
:
foo.respond_to? :to_a
=> true
但是,这不是必需的,因为它还响应map
,each
以及我们在迭代 Array 时期望的所有正常事物,因为它包含Enumerable。map
,根据定义,自动返回一个数组,因此您在评论和问题中想知道的转换。
foo.methods.sort - Object.methods
=> [:%, :&, :+, :-, :/, :<<, :[], :add_class, :after, :all?, :any?, :at, :at_css, :at_xpath, :attr, :attribute, :before, :children, :chunk, :collect, :collect_concat, :count, :css, :cycle, :delete, :detect, :document, :document=, :drop, :drop_while, :each, :each_cons, :each_entry, :each_slice, :each_with_index, :each_with_object, :empty?, :entries, :filter, :find, :find_all, :find_index, :first, :flat_map, :grep, :group_by, :index, :inject, :inner_html, :inner_text, :last, :length, :map, :max, :max_by, :member?, :min, :min_by, :minmax, :minmax_by, :none?, :one?, :partition, :pop, :push, :reduce, :reject, :remove, :remove_attr, :remove_class, :reverse, :reverse_each, :search, :select, :set, :shift, :size, :slice, :slice_before, :sort, :sort_by, :take, :take_while, :text, :to_a, :to_ary, :to_html, :to_xhtml, :to_xml, :unlink, :wrap, :xpath, :zip, :|]
我怀疑uniq
未实施的原因是很难弄清楚如何测试唯一性。一个非常简单的标签,例如:
<div class="foo" id="bar">
在功能上与以下内容相同:
<div id="bar" class="foo">
但明显的to_s
测试将失败,因为它们与字符串相等测试不匹配。
标签必须在运行中进行规范化以将它们的参数放入相同的顺序,然后转换为字符串,但是如果class
参数"foo1 foo2"
在第一个标签和"foo2 foo1"
第二个标签中怎么办?代码是否uniq
必须深入研究特定参数并重新排序?而且,如果标签是一个容器div
怎么办?测试中是否也应考虑节点的子节点uniq
?
我认为这是我们大多数人会很快回避的一罐蠕虫,而那些试图定义的uniq
人会学到关于兔子洞的非常宝贵的一课。相反,您可以自由定义uniq
适合您的特定应用程序,因此它对您有意义。我认为这对 Nokogiri 的作者来说是一个很棒的设计决定。