2012-09-10 55 views
2

Ruby中有沒有類似於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 

或類似的東西,然後我就可以創建數據類的一個新實例:

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++中)有所謂的 「記錄」 的數據結構此目的。

回答

1

您CAND使用Hash爲您的屬性/屬性桶,或者你可以使用Ruby的元編程能力產生使用accessors這樣的getter和setter方法:

attr_accessor :desc, :size, :address 

您還可以收集數組中的屬性,並使用像這樣的噴濺來擴展前面提到的方法所需的列表中的數組:

attributes = [:desc, :size, :address] 
attr_accessor *attributes 
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(…, …, …) 
+0

在Pascal中有一個特徵「with」: 'd do begin – Konstantin

相關問題