2015-08-20 14 views
7

mogą Państwo ulepszyć klasę zJak zawęzić metodę modułu w Ruby?

module RefinedString 
    refine String do 
    def to_boolean(text) 
    !!(text =~ /^(true|t|yes|y|1)$/i) 
    end 
    end 
end 

ale jak udoskonalić metody modułu? to:

module RefinedMath 
    refine Math do 
    def PI 
     22/7 
    end 
    end 
end 

podnosi: TypeError: wrong argument type Module (expected Class)

Odpowiedz

1

Udoskonalenia modyfikować tylko zajęcia, a nie moduły więc argument musi być klasą.

- http://ruby-doc.org/core-2.1.1/doc/syntax/refinements_rdoc.html

Tak szybko, jak jesteś świadomy tego, co robisz, masz dwie opcje do udoskonalić metod modułu na całym świecie. Od Ruby ma otwarte zajęcia, można po prostu zastąpić metodę:

▶ Math.exp 2 
#⇒ 7.38905609893065 
▶ module Math 
▷ def self.exp arg 
▷  Math::E ** arg 
▷ end 
▷ end 
#⇒ :exp 
▶ Math.exp 2 
#⇒ 7.3890560989306495 

Czy chcesz zapisać funkcjonalności sposobu zostać zastąpione:

▶ module Math 
▷ class << self 
▷  alias_method :_____exp, :exp 
▷  def exp arg 
▷  _____exp arg  
▷  end 
▷ end 
▷ end 
#⇒ Math 
▶ Math.exp 2 
#⇒ 7.3890560989306495 

Proszę mieć świadomość skutków ubocznych.

+1

Więc jest jakiś sposób, aby _refine_ metody modułu? –

+0

W tej chwili nie ma sposobu na udoskonalenie modułów, jak to wyraźnie stwierdzono w dokumentacji, którą połączyłem. – mudasobwa

+0

Możliwe, że istnieje inne rozwiązanie niż użycie metody 'refine' i to właśnie szukam –

8

Cóż, od definiowania moduł #method jest equivalent do definiowania metodę instancji na jego #singleton_class dodaje zadziała:

module Math 
    def self.pi 
     puts 'original method' 
    end 
end 

module RefinementsInside 
    refine Math.singleton_class do 
     def pi 
      puts 'refined method' 
     end 
    end 
end 

module Main 
    using RefinementsInside 
    Math.pi #=> refined method 
end 

Math.pi #=> original method 
Powiązane problemy