web-dev-qa-db-ja.com

Ruby:オブジェクト/クラスの配列

私はRuby=エキスパートではなく、これは私に問題を引き起こしています。しかし、ルビでオブジェクト/クラスの配列を作成するにはどうしたらいいですか?それを初期化/宣言するにはどうすればいいですか?事前に感謝します手伝い。

これは私のクラスであり、その配列を作成したいと思います。

class DVD
  attr_accessor :title, :category, :runTime, :year, :price

  def initialize()
    @title = title
    @category = category
    @runTime = runTime
    @year = year
    @price = price
  end
end
13
Chris Cruz

Rubyはダック型(動的型付け)であり、ほとんどすべてがオブジェクトであるため、配列に任意のオブジェクトを追加できます。例えば:

[DVD.new, DVD.new]

2つのDVDが入ったアレイが作成されます。

a = []
a << DVD.new

dVDがアレイに追加されます。 配列関数の完全なリストについては、Ruby API を確認してください。

ところで、DVDクラスのすべてのDVDインスタンスのリストを保持したい場合は、クラス変数を使用してこれを行うことができ、新しいDVDオブジェクトを作成するときにそれをその配列に追加します。

class DVD
  @@array = Array.new
  attr_accessor :title, :category, :runTime, :year, :price 

  def self.all_instances
    @@array
  end

  def initialize()
    @title = title
    @category = category
    @runTime = runTime
    @year = year
    @price = price
    @@array << self
  end
end

今なら

DVD.new

これまでに作成したすべてのDVDのリストを取得できます。

DVD.all_instances
19
rik.vanmechelen

two_DVD = Array.new(2){DVD.new}

6
Fanda

Rubyでオブジェクトの配列を作成するには:

  1. 配列を作成して名前にバインドします。

    array = []
    
  2. オブジェクトをそれに追加します。

    array << DVD.new << DVD.new
    

オブジェクトはいつでも配列に追加できます。

DVDクラスのすべてのインスタンスにアクセスしたい場合は、 ObjectSpace を使用できます。

class << DVD
  def all
    ObjectSpace.each_object(self).entries
  end
end

dvds = DVD.all

ちなみに、インスタンス変数は正しく初期化されていません。

次のメソッド呼び出し:

attr_accessor :title, :category, :run_time, :year, :price

attribute/attribute=インスタンスメソッドを自動的に作成して、インスタンス変数の値を取得および設定します。

定義されているinitializeメソッド:

def initialize
  @title = title
  @category = category
  @run_time = run_time
  @year = year
  @price = price
end

引数を取りませんが、インスタンス変数を設定します。効果的に発生するのは:

  1. attributeリーダーメソッドが呼び出されます
  2. 未設定の変数を読み取ります
  3. nilを返します
  4. nilは変数の値になります

実行したいことは、変数の値をinitializeメソッドに渡すことです。

def initialize(title, category, run_time, year, price)
  # local variables shadow the reader methods

  @title = title
  @category = category
  @run_time = run_time
  @year = year
  @price = price
end

DVD.new 'Title', :action, 90, 2006, 19.99

また、唯一の必須属性がDVDのタイトルである場合は、次の方法で行うことができます。

def initialize(title, attributes = {})
  @title = title

  @category = attributes[:category]
  @run_time = attributes[:run_time]
  @year = attributes[:year]
  @price = attributes[:price]
end

DVD.new 'Second'
DVD.new 'Third', price: 29.99, year: 2011
5
Matheus Moreira