我需要创建一个新的空对象并访问它的属性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
Ruby 中的 Array 与 JavaScript 中的 Array 不同——您不能按名称引用元素,而只能按索引。你可能想要的是一个哈希。
my_object = {}
my_object['title'] = "abc"
或者您可以在初始化时设置它:
my_object = {'title' => 'abc'}
或者,您可以使用 OpenStruct 来使用动态属性设置器进行分配:
my_object = OpenStruct.new
my_object.title = "abc"
这取决于您希望对象具有哪些属性。你举了一个例子
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
, in initialize
, 是为您的类实例提供数组属性的原因。在super
任何方法中调用时,都会调用同名的父类方法。所以这里调用Array#initialize
. 此外,super
传递其方法接收到的所有参数;也就是说,你不需要写
super args
您可以对大多数 Ruby 对象(例如,散列和字符串)执行此操作,但也有一些例外。特别是,您不能子类化Fixnum
或Symbol
。