gpt4 book ai didi

ruby - 改进仅适用于实例方法吗?

转载 作者:数据小太阳 更新时间:2023-10-29 06:39:05 27 4
gpt4 key购买 nike

我试图了解 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 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 (???)

为什么 #what_are_you 是精致的,而 .preferred_accommodation 不是?

最佳答案

正如@MasashiMiyazaki 所解释的,您必须优化两个类:TravellerTraveller 的单例类。这实际上可以大大简化您的代码:

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

关于ruby - 改进仅适用于实例方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27833447/

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