Мне нравится ответ Мирона, но он страдает от болезни Руби «Я больше не использую 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 был для людей, а для людей означает ясность . Присвоение имени объекту через имя переменной и его имя класса делают вещи намного более понятными.