Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 细化是否仅适用于实例方法?_Ruby_Refinements - Fatal编程技术网

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

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

为什么
#你是什么?
优化了,但是
首选的?
不是吗?

你需要调用具有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的对象模型,这是有意义的。谢谢