私はRuby=エキスパートではなく、これは私に問題を引き起こしています。しかし、ルビでオブジェクト/クラスの配列を作成するにはどうしたらいいですか?それを初期化/宣言するにはどうすればいいですか?事前に感謝します手伝い。
これは私のクラスであり、その配列を作成したいと思います。
class DVD
attr_accessor :title, :category, :runTime, :year, :price
def initialize()
@title = title
@category = category
@runTime = runTime
@year = year
@price = price
end
end
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
two_DVD = Array.new(2){DVD.new}
Rubyでオブジェクトの配列を作成するには:
配列を作成して名前にバインドします。
array = []
オブジェクトをそれに追加します。
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
引数を取りませんが、インスタンス変数を設定します。効果的に発生するのは:
attribute
リーダーメソッドが呼び出されますnil
を返します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