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”的数据结构用于此目的。
答案 0 :(得分:1)
是的,它使用C / C ++名称而不是记录:Struct
。 Struct
是一个类工厂,如果您调用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)