2009-03-07 32 views
19

Bất kể thực hành tốt hay không, làm thế nào tôi có thể tự động gọi các phương thức accessor trong Ruby?Làm thế nào để tự động gọi các phương thức accessor trong Ruby

Dưới đây là một lớp dụ:

class Test_Class 
    attr_accessor :a, :b 
end 

tôi có thể sử dụng phương pháp Object.send để đọc biến ...

instance.a = "value" 
puts(instance.send("a")) 
# => value 

Nhưng tôi có một thời gian khó khăn cố gắng để viết thư cho nó. Những ném "nhầm số của đối số (1 0) (ArgumentError)"

instance.send("a", "value") 

instance.method("a").call("value") 

Xin hãy giúp tôi StackOverflow!

Trả lời

44

Tôi không phải là chuyên gia ruby, nhưng tôi nghĩ rằng bạn có thể làm:

instance.send("a=", "value") 
+0

trình, tuyệt vời! Tôi đoán dấu bằng là một phần của tên phương thức? –

+0

Có, dấu bằng theo cách thông thường để xác định phương thức setter trong Ruby. Tôi sẽ sử dụng biểu tượng thay vì chuỗi. 'instance.send (: a =," value ")' –

+0

Đúng. attr_accessor thực hiện hai phương pháp: def v; @v; kết thúc và def v = (giá trị); @ v = giá trị; kết thúc – Angela

9

Bạn cũng có thể truy cập trực tiếp các biến thể hiện của một đối tượng sử dụng instance_variable_* chức năng:

instance = Test_Class.new     # => #<Test_Class:0x12b3b84> 

# instance variables are lazily created after first use of setter, 
# so for now instance variables list is empty: 
instance.instance_variables    # => [] 

instance.instance_variable_set(:@a, 123) # => 123 
instance.a         # => 123 
instance.instance_variables    # => ["@a"] 
instance.instance_variable_get("@a")  # => 123 
Các vấn đề liên quan