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

2

Ruby 中的 Array 与 JavaScript 中的 Array 不同——您不能按名称引用元素,而只能按索引。你可能想要的是一个哈希。

my_object = {}
my_object['title'] = "abc"

或者您可以在初始化时设置它:

my_object = {'title' => 'abc'}

或者,您可以使用 OpenStruct 来使用动态属性设置器进行分配:

my_object = OpenStruct.new
my_object.title = "abc"
于 2013-11-07T01:18:54.163 回答
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, in initialize, 是为您的类实例提供数组属性的原因。在super任何方法中调用时,都会调用同名的父类方法。所以这里调用Array#initialize. 此外,super传递其方法接收到的所有参数;也就是说,你不需要写

super args

您可以对大多数 Ruby 对象(例如,散列和字符串)执行此操作,但也有一些例外。特别是,您不能子类化FixnumSymbol

于 2013-11-07T03:17:09.250 回答