2

Pascal レコードに似た Ruby のデータ構造はありますか?

約 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++) には、この目的のために「レコード」と呼ばれるデータ構造がありました。

4

2 に答える 2

1

属性/プロパティのバケットとしてハッシュを使用することも、次のようなアクセサーを使用してゲッターとセッターを生成するためにRubyのメタプログラミング機能を利用することもできます。

attr_accessor :desc, :size, :address

配列内の属性を収集し、次のようにスプラッティングを使用して、前述の方法で必要なリスト内の配列を展開することもできます。

attributes = [:desc, :size, :address]
attr_accessor *attributes
于 2012-09-10T09:55:18.917 に答える
1

はい、あります。record : の代わりに 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(…, …, …)
于 2012-09-10T09:53:47.900 に答える