【问题标题】:Is it suspicious to think that methods go missing in ruby?认为红宝石中缺少方法是否可疑?
【发布时间】:2011-11-07 10:21:47
【问题描述】:
class Person
  def name
    puts "Doharey"
  end
end

puts Person.class #=> this out puts Class
puts Class.methods.count #=> 82 methods
puts Person.methods.count #=> 82 methods

在上面的示例中,创建了一个Person 类,该类继承自Class,并且PersonClass 具有相同数量的方法。

现在让我们实例化Person

a = Person.new
puts a.methods.count #=> 42 methods

如果aPerson 的一个实例,那么为什么a 中的方法数量少于Person。发生什么了 ?有些方法怎么不见了?他们不是一开始就继承的吗?如果有怎么办?

【问题讨论】:

  • 你的Person类不是继承自Class,而是继承自Object
  • “认为 ruby​​ 中缺少方法是否值得怀疑?”你签到Kernel#method_missing了吗? [对不起,实在忍不住。]
  • Kernel#methods_missing 是什么? “[抱歉,实在忍不住]” => 没听明白,什么?
  • 开个玩笑,真的。但是,如果您想了解method_missing(而且您应该!),请看这里,例如:rubylearning.com/blog/2010/10/07/…

标签: ruby class methods instance


【解决方案1】:
 a.methods

是实例方法和

 Person.methods

是类方法。它们不共享相同的命名空间。当您在 Person 上定义 name 时,您正在定义实例方法。

class Person
  def self.name
    puts "Doharey"
  end
end
=> nil
Person.methods.count
=> 113
Class.methods.count
=> 114

这里我定义了一个类方法,它也显示在方法列表中。

【讨论】:

  • 这是我首先想到的,根据定义,对象不能有类方法。并且类方法只能从未实例化的类调用,而不是类的实例。但是“Person”类本身是“Class”类的一个实例,实际上“Person”是一个对象。这是矛盾的。
  • 也相关,Person.instance_methods返回实例方法列表,所以Person.instance_methods.count == Person.new.methods.count
  • 如果是这种情况,当您说Person.methods 提供类方法列表并且Person.instance_methods 提供一个实例方法列表。并且类方法不应出现在实例中。那么inspectobject_id 等方法怎么会出现在两个列表中?
  • 因为类也是一个对象——Class 类的一个实例。所以你看到的是Class 的实例方法。如果只想查看自己类的类方法,请使用Person.methods(false)
【解决方案2】:
class Person
  def name
    puts "Doharey"
  end
end

我们的新类中有多少实例方法?

Person.instance_methods.size
# => 72

列出一个类的所有实例方法,不包括从超类继承的任何方法:

Person.instance_methods(false)
# => [:name]

默认情况下,每个新类都是 Object 的子类:

Person.superclass
# => Object

超类中有多少实例方法?

Object.instance_methods.size
# => 71

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 2015-12-23
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    相关资源
    最近更新 更多