Ruby 从Nokogiri::XML::Node::SaveOptions常量中删除类名

Ruby 从Nokogiri::XML::Node::SaveOptions常量中删除类名,ruby,nokogiri,Ruby,Nokogiri,是否有任何方法可以像使用模块一样包含来自的常量 我目前正在使用 save_options = Nokogiri::XML::Node::SaveOptions::FORMAT | Nokogiri::XML::Node::SaveOptions::AS_HTML puts html.serialize(:save_with => save_options) 我宁愿 html.serialize(:save_with => FORMAT | AS_HTML) 我可以通过使用 inc

是否有任何方法可以像使用模块一样包含来自的常量

我目前正在使用

save_options = Nokogiri::XML::Node::SaveOptions::FORMAT | Nokogiri::XML::Node::SaveOptions::AS_HTML
puts html.serialize(:save_with => save_options)
我宁愿

html.serialize(:save_with => FORMAT | AS_HTML)
我可以通过使用

include Nokogiri::XML

html.serialize(:save_with => Node::SaveOptions::FORMAT | Node::SaveOptions::AS_HTML)


但这两者都不理想。有人有更好的方法吗?我看不出为什么这不能成为一个模块而不是一个类,因为创建一个对象的好处几乎不存在。

最安全的方法是“手动”创建所需的常量。如果在范围中写入此项,则将使用正确的值定义常量:

class YourClass # or module YourModule
  %w(FORMAT AS_HTML).each do |konst|
      const_set(konst, Nokogiri::XML::Node::SaveOptions.const_get(konst))
  end
end
如果常量的数量很大,您可以稍微自动化创建。问题是这是一种要么全有要么全无的方法,类名之类的东西也是常量,所以它们也会被导入。对于您正在寻找的常量来说,这似乎不是问题

class YourClass
  Nokogiri::XML::Node::SaveOptions.constants.each do |konst|
    const_set(konst, Nokogiri::XML::Node::SaveOptions.const_get(konst))
  end
end

希望对您有所帮助。

如果您正在使用
html.serialize(:save_with=>FORMAT | AS_html)
并希望简化它,为什么不使用:

html.to_html
它使用以下标志输出:

DEFAULT_HTML = FORMAT | NO_DECLARATION | NO_EMPTY_TAGS | AS_HTML
这是Nokogiri的标准HTML输出默认值

如果您需要所有电源,您可以向下钻取以使用
write_to

to_html
write_to
都记录在中。你可能也想要在源代码中四处窥探

DEFAULT_HTML = FORMAT | NO_DECLARATION | NO_EMPTY_TAGS | AS_HTML