my_object.title = 'abc'
ではなく、新しい空のオブジェクトを作成し、その属性にアクセスする必要がありますmy_object[:title] = 'abc'
。どうすればこれを行うことができますか?
my_object = Array.new
my_object.title = "abc"
# => undefined method `title=' for []:Array
my_object.title = 'abc'
ではなく、新しい空のオブジェクトを作成し、その属性にアクセスする必要がありますmy_object[:title] = 'abc'
。どうすればこれを行うことができますか?
my_object = Array.new
my_object.title = "abc"
# => undefined method `title=' for []:Array
オブジェクトにどのようなプロパティを持たせたいかによって異なります。あなたは例を挙げました
my_object = Array.new
my_object.title = "abc"
オブジェクトを効果的に配列にして、配列で使用可能なすべてのメソッドにアクセスしたいが、さらに追加のプロパティを追加したい場合、その方法は のサブクラスを作成することですArray
:
class MyArray < Array
attr_accessor :title
def initialize(*args)
super
end
end
MyArray.ancestors # => [MyArray, Array, Enumerable, Object, Kernel, BasicObject]
a = MyArray.new(3,2) # => [2,2,2]
b = MyArray.new # => []
b << 4 << 5 << 6 # => [4,5,6]
e = a+b # => [2, 2, 2, 4, 5, 6]
e.class # => Array
a.title = "This is array a"
puts a.title # => "This is array a"
e.title = "me, e" # => NoMethodError: undefined method `title='
b.class # => MyArray
b.is_a? Array # => true
c = [7,8,9] # => [7, 8, 9]
c.is_a? MyArray # => false
d = a+c # => [2, 2, 2, 7, 8, 9]
super
、 ininitialize
は、クラス インスタンスに配列のプロパティを与えるものです。がsuper
任意のメソッド内で呼び出されると、同じ名前の親クラス メソッドが呼び出されます。ここでは を呼び出しますArray#initialize
。さらに、super
そのメソッドが受け取ったすべてのパラメーターを渡します。つまり、書く必要はありません
super args
ほとんどの Ruby オブジェクト (ハッシュや文字列など) でこれを行うことができますが、いくつかの例外があります。Fixnum
特に、またはをサブクラス化することはできませんSymbol
。