私はRubyの洗練された機能を理解しようとしています。私は理解できないシナリオに遭遇しました。私はREPLでこれを行う際に、今絞り込みはインスタンスメソッドにのみ適用されますか?
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
:
は、この例のコードを取る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
はないですか?
'Traveller.preferred_accommodation'はクラスメソッドです。 'Traveller.new.preferred_accommodation'はあなたが期待しているものを出力します(基本クラスをインクルードして拡張しているので)。しかし' Traveller'は 'Class'クラスのインスタンスです。 'Traveller.preferred_accommodation'を洗練させたい場合は、class' class_を_refineする必要があります。 – mudasobwa
@ mudasobwa、そうすることはできますが、洗練されたバージョンのメソッドをすべてのクラスで利用できるようにはできませんか?それは、クラスメソッド 'Class'に対してインスタンスメソッドを定義してクラスメソッドを作成するのと同じ問題ではありませんか?それらはすべてのクラスのクラスメソッドになりますか?私は、シングルトンのクラスを洗うこと以上にそれをやっていくことのメリットは分かりません。明らかな欠点もあります。 –
@CarySwoveland確かにあなたは正しいです。私はそれが**クラスの洗練で**行われてはならないと言っています。私がコメントを落とした理由は答えではありません。私は何が起こっているのかを明かそうと思っていましたが、ハウツーレシピを提供したくありませんでした。 – mudasobwa