xml – Ruby:attr_accessor生成的方法 – 如何迭代它们(在to_s中 – 自定义格式)?

前端之家收集整理的这篇文章主要介绍了xml – Ruby:attr_accessor生成的方法 – 如何迭代它们(在to_s中 – 自定义格式)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要一个具有半自动’to_s’方法的Class(实际上生成 XML).
我想遍历我的’attr_accessor’行中设置的所有自动方法
  1. class MyClass
  2. attr_accessor :id,:a,:b,:c
  3. end
  4.  
  5. c=MyClass.new

到目前为止,我正在做一个基本的:

  1. c.methods - Object.methods
  2.  
  3. => ["b","b=","c","c=","id=","a","a="]

我面临一些挑战:

>’id’可能会引起轻微的头痛 – 因为Object似乎已经有了’id’.
>上面的’c.methods’调用,返回字符串 – 我没有得到任何其他元数据? (在Java’方法’中是一个对象,我可以在其中进行进一步的反射).
>我有一对多的关系我必须处理(‘c’是其他对象类型的数组类型).

这就是我想要做的:我想设计一个简单的Object,它有一个’to_s’,它将构建一个XML片段:例如.

  1. <id> 1 </id>
  2. <a> Title </a>
  3. <b> Stuff </b>
  4. <c>
  5. <x-from-other-object>
  6. <x-from-other-object>
  7. ....
  8. </c>

然后从这个简单的对象继承我的数据类:这样(希望)我得到一个mechansim来构建一个完整的XML文档.

我相信我也在这里重新发明轮子……所以其他久经考验的方法也值得欢迎.

要从字符串中获取方法对象,可以使用方法方法或instance_method(其中方法将在对象上调用,而instance_method在类上调用).它给你的唯一有趣的信息是arity(与java相反,它也提供了返回值和参数的类型,这当然在ruby中是不可能的).

您的标题表明您只想迭代attr_accessor创建的方法,但您的代码将迭代您的类中定义的每个方法,如果您想在类中添加其他非访问方法,这可能会成为一个问题.

要摆脱这个问题和id的问题,你可以在attr_accessor周围使用自己的包装器来存储它为其创建访问器的变量,如下所示:

  1. module MyAccessor
  2. def my_attr_accessor *attrs
  3. @attrs ||= []
  4. @attrs << attrs
  5. attr_accessor *attrs
  6. end
  7.  
  8. def attrs
  9. @attrs
  10. end
  11. end
  12.  
  13. class MyClass
  14. extend MyAccessor
  15. my_attr_accessor :id,:c
  16.  
  17. def to_s
  18. MyClass.attrs.each do |attr|
  19. do_something_with(attr,send(attr))
  20. end
  21. end
  22. end

对于问题3,你可以这样做

  1. if item.is_a? Array
  2. do_something
  3. else
  4. do_something_else
  5. end

猜你在找的XML相关文章