如何在类上定义一个方法,除了它的某个子类?

时间:2015-03-14 03:43:51

标签: ruby

我想在类上定义一个方法,除了它已经定义了相同方法名的某个子类。

例如,我想在name上定义一个方法Object,让它可以从Object及其子类访问,但Module及其子类除外。 name已经存在。这样做的最佳方式是什么?

我的尝试是这样的:

class Object
  class ::Module; alias orig_name name end
  def name
    ...
  end
  class ::Module; alias name orig_name end
end

是否有更好的方法可以使用prepend

2 个答案:

答案 0 :(得分:1)

只需在Object上定义您的方法即可。由于Module的祖先是Object,它首先会看到Module然后是Object。

class Object
  def name
    puts self.class
  end
end

class Module < Object
  def name
    puts "name #{self.class}"
  end
end

Object.new.name
# => Object
Module.new.name
# => name Module

如果您创建继承自Object和Module的新类:

class ObjectInheritance < Object
end

class ModuleInheritance < Module
end

ObjectInheritance.new.name
# => ObjectInheritance
ModuleInheritance.new.name
# => name ModuleInheritance

Ruby首先会在self中查找方法,然后是包含模块,然后是祖先类。

答案 1 :(得分:0)

这不是def已经有效吗?

class Object
  def name
    "This is my name"
  end
end

Module.name # => "Module"
Class.name  # => "Class"
String.name # => "String"
Object.new.name # => "This is my name"