2010-09-29 11 views

Odpowiedz

6

W Ruby, zawsze można dodać metod do istniejącej klasy, nawet jeśli jeden rdzeń „Otwartych Klasy

class String 
    def bar 
    "bar" 
    end 
end 

"foo".bar # => "bar" 

Funkcja ta nazywa się To wspaniała funkcja, ale powinieneś być ostrożny: używaj go niedbale i będziesz patching like a monkey.

17

W rzeczywistości nie zdefiniowałeś ponownie klasy Punkt, ponownie ją otworzyłeś. Trochę fragment kodu, aby zilustrować różnicę:

class Point 
    def foo 
    end 
end 

class Point 
    def bar 
    end 
end 

Teraz Point posiada dwie metody: foo i bar. Tak więc druga definicja Point nie zastąpiła poprzedniej definicji, została do niej dodana. Jest to możliwe w skryptach ruby ​​oraz w irb (jest to również możliwe w przypadku klas ze standardowej biblioteki, nie tylko własnej).

Możliwe jest również, aby naprawdę przedefiniować zajęcia, korzystając remove_const usunąć poprzedni wiązanie pierwszej nazwy klasy:

class Point 
    def foo 
    end 
end 
Object.send(:remove_const, :Point) 
class Point 
    def bar 
    end 
end 
Point.instance_methods(false) #=> ["bar"] 
Powiązane problemy