gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 01:44:41 24 4
gpt4 key购买 nike

我需要一个具有半自动“to_s”方法(实际上是生成 XML)的类。我想遍历我的“attr_accessor”行中设置的所有自动方法:

class MyClass
attr_accessor :id,:a,:b,:c
end

c=MyClass.new

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

c.methods - Object.methods

=> ["b", "b=", "c", "c=", "id=", "a", "a="]

我面临着一些挑战:

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

这就是我想要做的:我想设计一个简单的对象,它有一个“to_s”,它将构建一个 XML 片段:例如。

<id> 1 </id>
<a> Title </a>
<b> Stuff </b>
<c>
<x-from-other-object>
<x-from-other-object>
....
</c>

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

我敢肯定,我也在重新发明轮子……所以欢迎使用其他久经考验的方法。

最佳答案

要从字符串中获取方法对象,您可以使用方法 methodinstance_method(其中 method 将在对象上调用并且instance_method 在一个类上)。不过,它为您提供的唯一有趣信息是元数(与 java 不同,它还会为您提供返回值和参数的类型,这在 ruby​​ 中当然是不可能的)。

您的标题表明您只想遍历 attr_accessor 创建的方法,但是您的代码将遍历类中定义的每个方法,如果您想添加额外的非- 类的访问器方法。

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

module MyAccessor
def my_attr_accessor *attrs
@attrs ||= []
@attrs << attrs
attr_accessor *attrs
end

def attrs
@attrs
end
end

class MyClass
extend MyAccessor
my_attr_accessor :id,:a,:b,:c

def to_s
MyClass.attrs.each do |attr|
do_something_with(attr, send(attr))
end
end
end

对于问题3你可以做

if item.is_a? Array
do_something
else
do_something_else
end

关于xml - Ruby:attr_accessor 生成的方法 - 如何迭代它们(以 to_s - 自定义格式)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2020195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com