Nokogiri :: XML :: Builder #send什么都不做

时间:2014-03-27 18:55:48

标签: ruby nokogiri

在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?

https://www.ruby-forum.com/topic/4406393

1 个答案:

答案 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