2013-05-15 14 views
8

Tôi muốn tạo ra số lượng lớn các thuộc tính mà có thể được thực hiện một cách dễ dàng nếu được xây dựng với phương thức gọi như thế này,Xác định danh sách thuộc tính trong attr_accessor với phương pháp gọi

attr_accessor :attr_list 

def attr_list 
    [:x1, :y1, :x2, :y2] 
end 

này không hoạt động. Có cách nào khác để đạt được điều này không?

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

14

đặn nó ra,

def self.attr_list 
[:x1, :y1, :x2, :y2] 
end 

attr_accessor *attr_list 

Giải thích:

Như attr_accessor là một lời gọi phương thức mà hy vọng danh sách tham số. Vì vậy, chúng tôi không thể vượt qua mảng như nó được. (*) sẽ chuyển đổi mảng thành danh sách tham số.

Chỉ cần xác định phương thức lớp trả về mảng danh sách thuộc tính được chuyển đến attr_accessor.

Hoạt động tốt với attr_accessible (hoặc bất kỳ điều gì tương tự).

+0

Cảm ơn bạn - được đánh giá cao –

0

Các giải pháp chấp nhận tạo ra một cảnh báo ruby:

'*' hiểu là tiền tố lập luận

Một thay thế sẽ làm điều gì đó như thế này:

def attr_list 
    [:x1, :y1, :x2, :y2] 
end 

attr_list.each { |attr| attr_accessor attr } 

hoặc

ATTR_LIST = [:x1, :y1, :x2, :y2] 
ATTR_LIST.each { |attr| attr_accessor attr } 
2

Một cách để thực hiện việc này mà không phải cảnh báo:

class MyClass 
    ATTR_LIST = [:x1, :y1, :x2, :y2] 
    attr_accessor(*ATTR_LIST) 
end 
Các vấn đề liên quan