2012-08-12 24 views
35

Vui lòng giúp tôi nhận tất cả các biến mẫu được khai báo trong một lớp giống như cách instance_methods cho tôi biết tất cả các phương thức có sẵn trong lớp học.Nhận tất cả các biến mẫu được khai báo trong lớp

class A 
    attr_accessor :ab, :ac 
end 

puts A.instance_methods #gives ab and ac 

puts A.something   #gives me @ab @ac... 
+1

tôi vẫn không có ý tưởng những gì phần thứ hai này là yêu cầu, hoặc làm thế nào nó liên quan đến cần phải có được tất cả các biến mẫu từ một đối tượng. –

+0

Biến thể hiện không được khai báo ở bất kỳ đâu. Câu hỏi này không có ý nghĩa gì cả. –

+1

Biến "tên" cũng được tạo động. –

Trả lời

46

Bạn có thể sử dụng instance_variables:

A.instance_variables 

nhưng điều đó có lẽ không phải những gì bạn muốn, vì đó được các biến Ví dụ trong lớpA, không phải là một thể hiện của lớp đó. Vì vậy, bạn có thể muốn:

a = A.new 
a.instance_variables 

Nhưng lưu ý rằng chỉ gọi attr_accessor không xác định bất kỳ biến dụ (nó chỉ chứa các phương thức), vì vậy sẽ không có bất cứ trong trường hợp cho đến khi bạn cài đặt chúng một cách rõ ràng.

a = A.new 
a.instance_variables #=> [] 
a.ab = 'foo' 
a.instance_variables #=> [:@ab] 
+0

Có phương pháp nào trong ruby ​​đếm các biến không xác định. Vì chúng tôi đã cung cấp danh sách trong attr_accessor. Vì vậy, một nơi nào đó mục nhập của họ đã được thực hiện. Cảm ơn bạn đã trả lời –

+0

@AkshayVishnoi 'attr_accessor: foo' chỉ tạo' def foo; @foo; end' và 'def foo = (val); @foo = val; kết thúc'. Không có gì được lưu trữ ở bất cứ đâu. –

+0

cảm ơn sự giúp đỡ của bạn nhưng tôi vẫn không tìm được cách để trả lời câu hỏi của tôi. Giống như sir nếu tôi có lớp 'Player' có chứa một tên biến. Bây giờ tôi đã khởi tạo 5 đối tượng. Bây giờ nếu tôi muốn tìm số người chơi có tên "Ak" thì tôi sẽ tạo ra chức năng này như thế nào trong Mô-đun nói "MyModule", được bao gồm trong lớp "Người chơi" Cảm ơn sự hợp tác của bạn –

6

Nếu bạn muốn để có được tất cả các biến trường hợp giá trị mà bạn có thể thử một cái gì đó như thế này:

class A 
    attr_accessor :foo, :bar 

    def context 
    self.instance_variables.map do |attribute| 
     { attribute => self.instance_variable_get(attribute) } 
    end 
    end 
end 

a = A.new 
a.foo = "foo" 
a.bar = 42 
a.context #=> [{ :@foo => "foo" }, { :@bar => 42 }] 
Các vấn đề liên quan