Ruby中是否有与Pascal记录类似的数据结构?

时间:2012-09-10 09:42:24

标签: ruby xml class record pascal

Ruby中是否有与Pascal记录类似的数据结构?

我想定义一个记录类型,它有大约15-20个字段,所有字段都是字符串。

我试图为此目的定义一个类,但我意识到我必须定义getter和setter方法:

class Data
   def description
        @description
   end

   def size
        @size
   end

   def address
        @address
   end

   .
   .  all other (about 15 variables...)
   . 

   def description=( value )
        @description = value
   end

   def size=(value)
        @size=value
   end

   def address=(value)
        @address=value
   end
  .
  . more setter method (about 15 times...)
  .

end

以这种方式定义所有15-20个字段和getter / setter非常烦人。有没有更短的方法呢?例如:

class Data
 desc, size, address=""
end

或者类似的东西,然后我就能够创建一个新的Data类实例:

d=Data.new

然后设置实例变量:

d.desc="bla"
d.size="50.66"
d.address="Bla street 20."

我已经有了一个可以用XMLSimple gem解析XML文件的方法,我想从解析后的数据中创建一个记录(或类),并使用“return”关键字将其返回。然后我想简单地访问记录的字段:d.size,d.address,d.description等。例如:

def data_import(fname="1.xml")
  data = XmlSimple.xml_in(fname,{'SuppressEmpty' => ""})
  d=Data.new()
  d.desc=data['desc'][0]
  d.size=data['size'][0]
  d.address=data['address'][0]
  d. ... =
  d. ... =  (about 15-20 times)
  d. ... =
  return d
end

我的XML(1.xml):

<entity>
 <desc>bla</desc>
 <size>50.66</size>
 <address>Bla street 20.</address>
 .
 . (15-20 more fields)
 .
</entity>

在Pascal语言中(据我所知,在C ++中)有一个名为“record”的数据结构用于此目的。

2 个答案:

答案 0 :(得分:1)

是的,它使用C / C ++名称而不是记录StructStruct是一个类工厂,如果您调用Struct.new,它将返回一个具有所需字段的类:

Data = Struct.new(:description, :size, :address, …)

如果您需要修改行为,可以将块传递给Struct.new

Data = Struct.new(:description, :size, :address, …) do
  def my_custom_method; end
end

或使用继承:

class Data < Struct.new(:description, :size, :address, …)
  def my_custom_method; end
end

然后:

d = Data.new

d.description = …
d.size = …
d.address = …

或者:

d = Data.new(…, …, …)

答案 1 :(得分:1)

你可以使用Hash作为属性/属性的存储桶,或者你可以使用Ruby的元编程功能来使用accessors生成getter和setter:

attr_accessor :desc, :size, :address

您还可以收集数组中的属性并使用这样的splatting来扩展前面提到的方法所需的列表中的数组:

attributes = [:desc, :size, :address]
attr_accessor *attributes