Có điều gì thành ngữ hơn những điều sau đây?
foo.class == String
Có điều gì thành ngữ hơn những điều sau đây?
foo.class == String
Câu trả lời:
Tôi nghĩ rằng bạn đang tìm kiếm instance_of?
. is_a?
và kind_of?
sẽ trả về true cho các thể hiện từ các lớp dẫn xuất.
class X < String
end
foo = X.new
foo.is_a? String # true
foo.kind_of? String # true
foo.instance_of? String # false
foo.instance_of? X # true
String
, mà còn với Integer
và Float
. Nó cũng hoạt động cho Decimal
? (văn bản siêu việt thông dịch viên nổi bật cú pháp khác nhau cho Decimal
mà làm cho tôi nghi ngờ)
Một cách tiếp cận gõ vịt hơn sẽ là
foo.respond_to?(:to_str)
to_str
chỉ ra rằng lớp của một đối tượng có thể không phải là con thực sự của Chuỗi, nhưng bản thân đối tượng đó rất giống chuỗi (stringy?).
foo
một trong hai sẽ được true
, false
hoặc một chuỗi vani, nhưng nó tốt để tìm hiểu các giải pháp tổng quát hơn.
to_str
, hay to_s
? Hai cái hơi khác nhau.
Bạn có thể làm:
foo.instance_of?(String)
Và tổng quát hơn:
foo.kind_of?(String)
kind_of
tổng quát hơn? Họ dường như đồng nghĩa: is_a
.
instance_of?
thay vì is_a?
.
Ngoài các câu trả lời khác, Class định nghĩa phương thức === để kiểm tra xem một đối tượng có phải là một thể hiện của lớp đó hay không.
Tôi nghĩ một cách tốt hơn là tạo một số phương thức vị từ. Điều này cũng sẽ lưu "Điểm kiểm soát duy nhất" của bạn.
class Object
def is_string?
false
end
end
class String
def is_string?
true
end
end
print "test".is_string? #=> true
print 1.is_string? #=> false
Cách gõ càng vịt;)
"string".is_a?(String)
. Có vẻ như bạn đang phát minh lại bánh xe. Ngoài ra còn có class
, instance_of
,kind_of
, vv ... Xấu ý tưởng để vá khỉ các Object
lớp, chưa kể đến đó là không cần thiết.
pre_check("test".is_string?)
Bây giờ yêu cầu dự án của bạn sẽ thay đổi và mọi Chuỗi có ba ký tự trở lên không còn được định nghĩa là Chuỗi nữa (tôi biết nó không bình thường;)) Bây giờ bạn có thể thay đổi phương thức của riêng mình một cách dễ dàng.
is_a?
đây thực sự là thành ngữ thích hợp hơn để sử dụng (và thường thì một câu kiểm tra đánh máy như Andrew Grimm đề cập thậm chí còn tốt hơn). So sánh lớp nghiêm ngặt thường là mùi mã. en.wikipedia.org/wiki/Liskov_substitution_principle