单个对象上的猴子补丁方法
Monkey patch method on single object
我想在模型 class 的 单个 实例上覆盖 update_attributes
方法的行为。假设变量被称为 @alert
最好的方法是什么?明确地说,我 不想 修改整个 class.
这个方法的行为
免责声明:
我需要执行此操作以在我需要时强制该方法 return false
,以便我可以为下面的错误处理代码编写单元测试。我知道这可能不是最佳做法。
创建对象后,对其调用"define_method":
object = Thing.new
object.define_method("update_attributes") { return false }
完成后,object.update_attributes
现在应该 return false
只需在对象上定义一个方法:
class Thing
def greeting
'yo, man'
end
end
Thing.instance_methods(false)
#=> [:greeting]
object = Thing.new
#=> #<Thing:0x007fc4ba276c90>
object.greeting
#=> "yo, man"
在 object
上定义两个方法(这将是 object
的单例中的实例方法 class。
def object.greeting
'hey, dude'
end
def object.farewell
'see ya'
end
object.methods(false)
#=> [:greeting, :farewell]
object.singleton_class.instance_methods(false) #=> [:greeting, :farewell]
object.greeting
#=> "hey, dude"
object.farewell
#=> "see ya"
new_obj = Thing.new
new_obj.greeting
#=> "yo, man"
new_obj.farewell
#NoMethodError: undefined method `farewell' for #<Thing:0x007fe5a406f590>
删除object
的单例方法greeting
。
object.singleton_class.send(:remove_method, :greeting)
object.methods(false)
#=> [:farewell]
object.greeting
#=> "yo, man"
从 object
的单例 class 中删除 :greeting
的另一种方法如下。
class << object
remove_method(:greeting)
end
我想在模型 class 的 单个 实例上覆盖 update_attributes
方法的行为。假设变量被称为 @alert
最好的方法是什么?明确地说,我 不想 修改整个 class.
免责声明:
我需要执行此操作以在我需要时强制该方法 return false
,以便我可以为下面的错误处理代码编写单元测试。我知道这可能不是最佳做法。
创建对象后,对其调用"define_method":
object = Thing.new
object.define_method("update_attributes") { return false }
完成后,object.update_attributes
现在应该 return false
只需在对象上定义一个方法:
class Thing
def greeting
'yo, man'
end
end
Thing.instance_methods(false)
#=> [:greeting]
object = Thing.new
#=> #<Thing:0x007fc4ba276c90>
object.greeting
#=> "yo, man"
在 object
上定义两个方法(这将是 object
的单例中的实例方法 class。
def object.greeting
'hey, dude'
end
def object.farewell
'see ya'
end
object.methods(false)
#=> [:greeting, :farewell]
object.singleton_class.instance_methods(false) #=> [:greeting, :farewell]
object.greeting
#=> "hey, dude"
object.farewell
#=> "see ya"
new_obj = Thing.new
new_obj.greeting
#=> "yo, man"
new_obj.farewell
#NoMethodError: undefined method `farewell' for #<Thing:0x007fe5a406f590>
删除object
的单例方法greeting
。
object.singleton_class.send(:remove_method, :greeting)
object.methods(false)
#=> [:farewell]
object.greeting
#=> "yo, man"
从 object
的单例 class 中删除 :greeting
的另一种方法如下。
class << object
remove_method(:greeting)
end