Ja lubię odpowiedź Myrona, ale cierpi na chorobę Rubinową "Nie używam już Java/C#, więc nigdy nie będę używał dziedziczenia ponownie". Otwieranie dowolnej klasy może być niebezpieczne i powinno być używane oszczędnie, , zwłaszcza, gdy jest to część głównej biblioteki Ruby. Nie mówię, że nigdy tego nie używaj, ale zazwyczaj łatwo jest tego uniknąć, a dostępne są lepsze opcje, np.
class IntegerInString < String
def initialize(s)
fail ArgumentError, "The string '#{s}' is not an integer in a string, it's just a string." unless s =~ /^\-?[0-9]+$/
super
end
end
Potem, gdy chcesz użyć ciąg znaków, który może być wiele to jasne, co robisz i nie sprać dowolnej klasy podstawowej, np
n = IntegerInString.new "2"
n.to_i
# => 2
IntegerInString.new "blob"
ArgumentError: The string 'blob' is not an integer in a string, it's just a string.
Możesz dodać wszelkiego rodzaju innych kontroli w initialize, jak sprawdzanie liczb binarnych itd Najważniejsze jest jednak to, że Ruby jest dla ludzi i jest dla ludzi oznacza klarowność. Nazewnictwo obiektu za pomocą jego nazwy zmiennej i powoduje, że jej nazwa klasy sprawia, że obiekty są bardziej wyraźne.
bezpieczeństwo trzecie !!! – jsh