发现Ruby对象成员?

dan*_*die 42 ruby discoverability

找出ruby对象暴露的方法/属性的简单方法是什么?

作为获取字符串成员信息的示例,您可以在PowerShell中执行此操作

"" | get-member
Run Code Online (Sandbox Code Playgroud)

在Python中,

dir("")
Run Code Online (Sandbox Code Playgroud)

有没有这么简单的方法来发现Ruby对象的成员信息?

And*_*imm 17

Ruby没有属性.每次要访问另一个对象中的实例变量时,都必须使用方法来访问它.

  • 很高兴知道一切都是一种方法.谢谢Andrew (4认同)

Mar*_*mas 11

获取对象方法的两种方法:

my_object.methods
MyObjectClass.instance_methods
Run Code Online (Sandbox Code Playgroud)

我做的一件事是从Object基类修剪继承的方法列表:

my_object.methods - Object.instance_methods
Run Code Online (Sandbox Code Playgroud)

列出对象的属性:

object.attributes
Run Code Online (Sandbox Code Playgroud)

  • #attributes是AR特定的; 对于普通的ruby对象,有#instance_variables.此外,您可以将false作为参数传递给#methods以跳过继承的参数. (13认同)
  • 有点旧,但`instance_variables`似乎没有显示未初始化的变量,希望它显示使用`attr_accessor`或其表兄弟设置的属性 (2认同)

Nim*_*imo 7

用这个:

my_object.instance_variables
Run Code Online (Sandbox Code Playgroud)


ses*_*b27 6

有两种方法可以实现这一点:

obj.class.instance_methods(false),其中 'false' 意味着它不会包含超类的方法,例如:

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"
Run Code Online (Sandbox Code Playgroud)

另一个是:

p1.instance_variables # => [:@name]
p1.instance_variable_get :@name # => "simon"
Run Code Online (Sandbox Code Playgroud)