gpt4 book ai didi

ruby-on-rails - 如何将模块包含到类中,以便模块覆盖类?

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:22 25 4
gpt4 key购买 nike

有没有办法将一个模块包含到一个类中,这样模块的方法覆盖类的方法?例如:

module UpcasedName
def name
@name.upcase
end
end

class User
attr_accessor :name
include UpcasedName
end

u = User.new
u.name = 'john'
puts u.name # outputs 'john', not 'JOHN'

在上面的示例中,u.name 是“john”,而不是“JOHN”。我知道如果我扩展用户对象而不是将模块包含到类中,这会工作

module UpcasedName
def name
@name.upcase
end
end

class User
attr_accessor :name
end

u = User.new
u.name = 'john'
u.extend UpcasedName
puts u.name # outputs 'JOHN'

但是,我想在类级别而不是对象级别包含模块。

最佳答案

目前有几种方法可以做到这一点。那么第一个也是最基本的是使用 ActiveSupport 的 alias_method_chain

require 'activesupport'

module UpcasedName
def self.included( base )
base.alias_method_chain :name, :upcase
end

def name_with_upcase
@name.upcase
end
end

class User
attr_accessor :name
include UpcasedName
end

u = User.new
u.name = 'john'
puts u.name

您发布的方法实际上类似于 Bruce Williams 在此处发布的方法:http://www.codefluency.com/articles/2009/01/03/wrapping-a-method-in-ruby

如果您对此非常执着,可以按照 Yehuda Katz 在此处发布的方法进行操作:http://yehudakatz.com/2009/01/18/other-ways-to-wrap-a-method/

关于ruby-on-rails - 如何将模块包含到类中,以便模块覆盖类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/629047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com