2011-01-20 11 views
30

Cách dễ dàng để tìm ra phương pháp/thuộc tính mà đối tượng ruby ​​phơi bày là gì?Khám phá các thành viên đối tượng Ruby?

Như một ví dụ để có được thông tin thành viên cho một chuỗi, trong PowerShell, bạn có thể làm

"" | get-member 

Trong Python,

dir("") 

Có như vậy một cách dễ dàng để khám phá thông tin thành viên của một đối tượng Ruby?

Trả lời

2
object.methods 

sẽ trả về một loạt các phương pháp trong đối tượng

9

Hai cách để có được phương pháp của một đối tượng:

my_object.methods 
MyObjectClass.instance_methods 

Một điều tôi làm để prune danh sách các phương pháp kế thừa từ lớp cơ sở Object:

my_object.methods - Object.instance_methods 

Để liệt kê các thuộc tính của một đối tượng:

object.attributes 
+12

# thuộc tính là AR cụ thể; đối với một đối tượng ruby ​​đơn giản có #instance_variables. Ngoài ra, bạn có thể truyền false như một đối số cho #methods để bỏ qua các thừa kế thừa kế. – noodl

+0

@noodl, cảm ơn. Tôi có nghĩa là instance_variables, nhưng có quá nhiều Rails trong đầu của tôi :) –

+2

Loại cũ, nhưng 'instance_variables' dường như không hiển thị biến uninitialized, đã hy vọng nó cho thấy các thuộc tính được thiết lập với' attr_accessor' hoặc anh em họ của nó –

14

Ruby không có thuộc tính. Mỗi lần bạn muốn truy cập một biến mẫu trong một đối tượng khác, bạn phải sử dụng một phương thức để truy cập nó.

+4

Thật tuyệt khi biết rằng mọi thứ là một phương pháp. Cảm ơn Andrew – Sung

0

Sử dụng này:

my_object.instance_variables 
4

Có hai cách để thực hiện điều này:

obj.class.instance_methods(false), nơi 'false' có nghĩa là nó sẽ không bao gồm các phương pháp của lớp cha, ví dụ như vậy có:

class Person 
    attr_accessor :name 
    def initialize(name) 
    @name = name 
    end 
end 

p1 = Person.new 'simon' 
p1.class.instance_methods false # => [:name, :name=] 
p1.send :name # => "simon" 

một trong những khác là với:

p1.instance_variables # => [:@name] 
p1.instance_variable_get :@name # => "simon"