Tôi thích câu trả lời của Myron nhưng nó mắc phải căn bệnh Ruby "Tôi không còn sử dụng Java / C # nữa nên tôi sẽ không bao giờ sử dụng quyền thừa kế nữa" . Mở bất kỳ lớp học nào cũng có thể gây nguy hiểm và nên được sử dụng một cách tiết kiệm, đặc biệt khi đó là một phần của thư viện cốt lõi của Ruby. Tôi không nói là đừng bao giờ sử dụng nó, nhưng nó thường dễ tránh và có những lựa chọn tốt hơn, vd
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
Sau đó, khi bạn muốn sử dụng một chuỗi có thể là một số, bạn sẽ rõ những gì bạn đang làm và bạn không ghi đè bất kỳ lớp lõi nào, ví dụ:
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.
Bạn có thể thêm tất cả các loại kiểm tra khác vào lúc khởi tạo, như kiểm tra số nhị phân, v.v. Điều chính yếu là Ruby dành cho mọi người và đối với mọi người có nghĩa là rõ ràng . Đặt tên một đối tượng thông qua tên biến và tên lớp của nó làm cho mọi thứ rõ ràng hơn nhiều .
^
và$
có ý nghĩa khác nhau một cách tinh tế như metachar so với hầu hết các hương vị regrec khác. Bạn có thể có nghĩa là để sử dụng\A
và\Z
thay vào đó.