Ruby Methods()方法

Vla*_*nov 5 ruby

我想了解Ruby方法的methods()工作方式。
我尝试使用“红宝石方法”访问Google,但这不是我所需要的。
我也看过ruby-doc.org,但没有找到这种方法。

您能否详细说明它的工作原理或给我链接?

更新资料

我尝试了methods()方法,并得到了以下结果:

'实验室老鼠'代码

class First
  def first_instance_mymethod
  end
  def self.first_class_mymethod
  end
end
class Second < First
  def second_instance_mymethod
  end
  def self.second_class_mymethod
  end
end
Run Code Online (Sandbox Code Playgroud)

与班级一起工作

#returns available methods list for class and ancestors
puts Second.methods.grep(/mymethod/)
  # => second_class_mymethod
  # => first_class_mymethod

#returns Class methods list for current class only 
puts Second.methods(false)
  # => second_class_mymethod
Run Code Online (Sandbox Code Playgroud)

处理对象

obj = Second.new
def obj.obj_singleton_mymethod
end

#returns available methods list for object and ancestors
puts obj.methods.grep(/mymethod/)
  # => second_instance_mymethod
  # => first_instance_mymethod

#returns current object class methods
puts obj.methods(false)
  # => obj_singleton_mymethod
Run Code Online (Sandbox Code Playgroud)

Paw*_*rok 5

可接受的答案略有不足。keymone在注释中给出了更完整的答案-.methods返回一个符号数组,该符号数组是在给定实例上定义的所有方法的名称。例如:

irb(main):012:0> object = ""
=> ""
irb(main):013:0> object.instance_eval("def foo;:bar;end")
=> nil
irb(main):014:0> object.methods.include?(:foo)
=> true
irb(main):016:0> "".methods.include?(:foo)
=> false
Run Code Online (Sandbox Code Playgroud)


小智 3

我不完全确定为什么它不在 ruby​​ 1.9 文档中(它似乎仍在代码中),但您可以在 1.8.7 文档中查看文档:http://www.ruby-doc.org/ core-1.8.7/classes/Object.html#M000032

基本上,在 ruby​​ 1.9 中,它只返回给定类及其祖先中所有方法的符号(名称)列表。(ruby 1.8 它返回一个字符串列表)