Мені подобається відповідь Майрона, але вона страждає на хворобу Рубі: "Я більше не використовую 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
замість цього.