2010-09-12 17 views
10

Tôi muốn có một mảng dưới dạng biến mẫu sử dụng attr_accessor.attr_accessor cho mảng?

Nhưng không phải là attr_accessor chỉ dành cho chuỗi?

Tôi làm cách nào để sử dụng nó trên một mảng?

CẬP NHẬT:

Ví dụ: Nếu bạn muốn:

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

Sau đó, bạn phải tự tạo các phương pháp đó?

+4

attr_accessor hoạt động cho bất kỳ đối tượng nào. Bạn đã thử chưa? Có chuyện gì? – Douglas

+0

@Douglas: Nhìn vào bản cập nhật –

+1

Nếu bạn định nghĩa một phương thức 'foo =' để sau khi thực hiện 'x.foo = bar',' x.foo' không trả về 'bar', bạn sẽ nhầm lẫn với bất kỳ ai người sử dụng lớp học của bạn. Tại sao không chỉ làm 'object.array <<" cat "'? – sepp2k

Trả lời

13

Re cập nhật của bạn:

Mặc dù bạn có thể thực hiện một lớp đóng vai trò như bạn mô tả, nó là khá bất thường, và có thể sẽ gây nhầm lẫn cho bất cứ ai sử dụng lớp học.

Người truy cập thông thường có người định cư và getters. Khi bạn thiết lập một cái gì đó bằng cách sử dụng setter, bạn nhận được cùng một điều trở lại từ getter. Trong ví dụ dưới đây, bạn sẽ có được một thứ hoàn toàn khác biệt với getter. Thay vì sử dụng setter, bạn có thể sử dụng phương thức add.

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 

Các phương thức add sẽ trông như thế này:

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

... 

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

+1 để được giải thích. Tôi cũng thích phương pháp <<. Vì vậy, bạn có thể viết object.array << "mèo" thay vì đẩy. Đây chỉ là một ký tự hơn object.array = "cat". – Baju

+4

Vâng, nó cũng có ý nghĩa gì cả, không giống như 'object.array =" cat "', là hoàn toàn bất hợp pháp. –

1

Nó làm việc cho tôi:

class Foo 

    attr_accessor :arr 

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

end 

f = Foo.new 
p f.arr 

Trả về sau

$ ruby /tmp/t.rb 
[1, 2, 3] 
$ 
18
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

Tôi nghĩ rằng có một trường hợp cho việc sử dụng này. Cân nhắc

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 

Và sau đó

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

Và sau đó cho sự chuyên nghiệp của chúng tôi có

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

Vì vậy, tôi sẽ:

attr_accessor :results 

def initialize 
    @results = [] 
end 

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

def result 
    @results.last 
end 

Bằng cách này result cư xử như bạn sẽ expec t, nhưng bạn cũng có được lợi ích của việc truy cập các giá trị trong quá khứ.

Các vấn đề liên quan