0

my_object.title = 'abc'ではなく、新しい空のオブジェクトを作成し、その属性にアクセスする必要がありますmy_object[:title] = 'abc'。どうすればこれを行うことができますか?

my_object = Array.new
my_object.title = "abc"
# => undefined method `title=' for []:Array
4

2 に答える 2

0

オブジェクトにどのようなプロパティを持たせたいかによって異なります。あなたは例を挙げました

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

于 2013-11-07T03:17:09.250 に答える