Ruby 细化是否仅适用于实例方法?
我试图理解Ruby的细化功能,但遇到了一个我不理解的场景 以以下代码为例:Ruby 细化是否仅适用于实例方法?,ruby,refinements,Ruby,Refinements,我试图理解Ruby的细化功能,但遇到了一个我不理解的场景 以以下代码为例: class Traveller def what_are_you puts "I'm a Backpacker" end def self.preferred_accommodation puts "Hostels" end end module Refinements module Money def what_are_you puts "I'm a cas
class Traveller
def what_are_you
puts "I'm a Backpacker"
end
def self.preferred_accommodation
puts "Hostels"
end
end
module Refinements
module Money
def what_are_you
puts "I'm a cashed-up hedonist!"
end
module ClassMethods
def preferred_accommodation
puts "Expensive Hotels"
end
end
def self.included(base)
base.extend ClassMethods
end
end
refine Traveller do
include Money
end
end
现在,当我在REPL中执行此操作时:
Traveller.new.what_are_you # => I'm a Backpacker
Traveller.preferred_accommodation # => Hostels
using Refinements
Traveller.new.what_are_you # => I'm a cashed-up hedonist!
Traveller.preferred_accommodation # => Hostels (???)
为什么
#你是什么?
优化了,但是首选的?
不是吗?你需要调用具有singleton?类范围的优化旅行者来覆盖类方法。通过将以下代码添加到您的优化模块而不是self.included
,您可以获得预期的结果
module Refinements
refine Traveller.singleton_class do
include Money::ClassMethods
end
end
这篇文章()将帮助您更好地理解细化。正如@MasashiMiyazaki所解释的,您必须细化两个类:
Traveler
和Traveler
的singleton类。这实际上允许您简化代码:
module Money
refine Traveller do
def what_are_you
puts "I'm a cashed-up hedonist!"
end
end
refine Traveller.singleton_class do
def preferred_accommodation
puts "Expensive Hotels"
end
end
end
Traveller.new.what_are_you #=> I'm a Backpacker
Traveller.preferred_accommodation #=> Hostels
using Money
Traveller.new.what_are_you #=> I'm a cashed-up hedonist!
Traveller.preferred_accommodation #=> Expensive Hotels
此外,通过将上述三条语句放在一个模块中,两种方法的改进版本仅限于该模块:
module M
using Money
Traveller.new.what_are_you #=> I'm a cashed-up hedonist!
Traveller.preferred_accommodation #=> Expensive Hotels
end
Traveller.new.what_are_you #=> I'm a Backpacker
Traveller.preferred_accommodation #=> Hostels
旅行者。首选住宿是一种分类方法Traveler.new.preferred_住宿
将打印您期望的内容(因为您在包含时扩展了基类)。但是Traveler
是类
类的一个实例。无论您是否想要Traveler.preferred\u
refined,您都需要对Class
Class进行优化。@mudasobwa,您可以这样做,但这不会使所有类都可以使用方法的优化版本吗?这不就是通过在类类上定义实例方法来创建类方法的问题吗:它们成为所有类的类方法吗?“我看不出这样做比优化单例类有什么好处,也看不出明显的缺点。”“CarySwoveland,你肯定是对的。我要说的是,它不能通过Class
细化来完成;我放弃评论而没有回答的原因是:我想阐明正在发生的事情,但不是给出一个操作方法。我理解“类方法”只是“单例类上的实例方法”,但不知何故,我忽略了这一含义。进一步考虑Ruby的对象模型,这是有意义的。谢谢