数组的attr_accessor?

时间:2010-09-12 00:50:02

标签: ruby

我希望使用attr_accessor将数组作为实例变量。

但不仅仅是字符串attr_accessor吗?

如何在阵列上使用它?

更新:

EG。如果你想:

object.array = "cat"
object.array = "dog"
pp object.array
=> ["cat", "dog"]

那你必须自己创建这些方法吗?

4 个答案:

答案 0 :(得分:19)

class SomeObject
  attr_accessor :array

  def initialize
    self.array = []
  end
end

o = SomeObject.new

o.array.push :a
o.array.push :b
o.array << :c
o.array.inspect   #=> [:a, :b, :c]

答案 1 :(得分:14)

重新更新:

虽然您可以实现一个按照您描述的方式运行的类,但这很不寻常,并且可能会混淆使用该类的任何人。

通常访问者有setter和getter。当你使用setter设置某些东西时,你会从getter中得到同样的东西。在下面的示例中,您将获得与getter完全不同的内容。您应该使用add方法,而不是使用setter。

class StrangePropertyAccessorClass

  def initialize
    @data = []
  end

  def array=(value)   # this is bad, use the add method below instead
    @data.push(value)
  end

  def array
    @data
  end

end

object = StrangePropertyAccessorClass.new

object.array = "cat"
object.array = "dog"
pp object.array

add方法如下所示:

  def add(value)
    @data.push(value)
  end

...

object.add "cat"
object.add "dog"
pp object.array

答案 2 :(得分:2)

它对我有用:

class Foo

  attr_accessor :arr

  def initialize() 
    @arr = [1,2,3]
  end

end

f = Foo.new
p f.arr

返回以下内容

$ ruby /tmp/t.rb
[1, 2, 3]
$

答案 3 :(得分:1)

我认为有这种用法的情况。考虑

begin
  result = do_something(obj)
  # I can't handle the thought of failure, only one result matters!
  obj.result = result
rescue
  result = try_something_else(obj)
  # okay so only this result matters!
  obj.result = result
end

然后是

# We don't really care how many times we tried only the last result matters
obj.result

然后对于职业选手我们有

# How many times did we have to try?
obj.results.count

所以,我会:

attr_accessor :results

def initialize
  @results = []
end

def result=(x)
  @results << x
end

def result
  @results.last
end

这样result就像你期望的那样,但你也可以获得访问过去价值的好处。