Мне нравится ответ Мирона, но он страдает от болезни Руби "Я больше не использую Java / C #, поэтому я никогда не буду использовать наследование снова" . Открытие любого класса может быть чревато опасностью и должно использоваться с осторожностью, особенно когда оно входит в состав основной библиотеки Ruby. Я не говорю, никогда не используйте его, но обычно его легко избежать, и что есть лучшие варианты, например,
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
Затем, когда вы хотите использовать строку, которая может быть числом, становится ясно, что вы делаете, и вы не затираете какой-либо основной класс, например
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.
В инициализацию можно добавлять всевозможные другие проверки, такие как проверка двоичных чисел и т. Д. Главное, однако, заключается в том, что Ruby предназначен для людей, а наличие для людей означает ясность . Присвоение имени объекта через его имя переменной и ее имя класса делает вещи гораздо яснее.
^
и$
имеют несколько иное значение как метачары, чем в большинстве других разновидностей регулярных выражений. Вы, вероятно, хотите использовать\A
и\Z
вместо.