Podoba mi się odpowiedź Myrona, ale cierpi ona na chorobę Ruby: „Nie używam już Java / C #, więc nigdy więcej nie będę używać dziedziczenia” . Otwieranie dowolnej klasy może być najeżone niebezpieczeństwami i powinno być używane oszczędnie, zwłaszcza gdy jest to część podstawowej biblioteki Rubiego. Nie mówię, że nigdy go nie używaj, ale zwykle jest to łatwe do uniknięcia i 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
Wtedy, gdy chcesz użyć łańcucha, który może być liczbą, jasne jest, co robisz i nie przebijasz żadnej 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.
Podczas inicjalizacji możesz dodać różnego rodzaju inne sprawdzenia, takie jak sprawdzanie liczb binarnych itp. Najważniejsze jest jednak to, że Ruby jest dla ludzi, a bycie dla ludzi oznacza przejrzystość . Nazywanie obiektu poprzez nazwę jego zmiennej i nazwę klasy sprawia, że wszystko jest dużo jaśniejsze.
^
i$
mają nieco inne znaczenia jako metachary niż w większości innych rodzajów wyrażeń regularnych. Prawdopodobnie masz zamiar użyć\A
i\Z
zamiast tego.