在Nokogiri 1.6.1中,我观察到以下行为:
require 'nokogiri'
xml1 = Nokogiri::XML::Builder.new do |xml|
xml.p
end
xml1.to_xml #=> <?xml version="1.0"?>\n<p/>
xml2 = Nokogiri::XML::Builder.new do |xml|
xml.send(:p)
end
xml2.to_xml #=> <?xml version="1.0"?>
因此,.p
生成<p/>
元素,而.send(:p)
则不生成任何内容。这里发生了什么?这种行为似乎与我读到的有关Nokogiri API的所有内容相矛盾。就Ruby的语义而言,它似乎也是不合逻辑的,除非该类重写#send
。
.send("p")
也是如此。
供参考:
How do I create XML using Nokogiri::XML::Builder with a hyphen in the element name?
答案 0 :(得分:2)
Ruby的send
method将调用私有方法和公共方法。在这种情况下,它最终调用Kernel#p
method,这是所有对象的私有方法。您可以通过将另一个参数传递给将要打印的p
来看到这一点:
xml.send(:p, "A message that will be printed")
另一种证明这一点的方法是使用public_send
,它不会查看私有方法,因此会触发method_missing
并生成标记。
xml.public_send(:p)
当然,您并不需要使用public_send
,因为p
不使用任何特殊字符,您可以直接将其用作方法:
xml.p