我希望使用attr_accessor
将数组作为实例变量。
但不仅仅是字符串attr_accessor
吗?
如何在阵列上使用它?
更新:
EG。如果你想:
object.array = "cat"
object.array = "dog"
pp object.array
=> ["cat", "dog"]
那你必须自己创建这些方法吗?
答案 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
就像你期望的那样,但你也可以获得访问过去价值的好处。