Có bất kỳ điều gì thành ngữ hơn thành phần sau không?Kiểm tra xem biến có phải là một chuỗi trong Ruby
foo.class == String
Có bất kỳ điều gì thành ngữ hơn thành phần sau không?Kiểm tra xem biến có phải là một chuỗi trong Ruby
foo.class == String
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 phiên bả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
Bạn có thể làm:
foo.instance_of?(String)
Và tổng quát hơn:
foo.kind_of?(String)
Điều gì làm cho 'kind_of' tổng quát hơn? Chúng có vẻ đồng nghĩa: ['is_a'] (http://ruby-doc.org/docs/ProgrammingRuby/html/ref_c_object.html#Object.is_a_qm). – davidchambers
@Davidchambers bạn nói đúng, 'kind_of?' là một từ đồng nghĩa cho 'is_a?'. – steenslag
@davidchambers: Bạn nói đúng, ý tôi là 'instance_of? 'Thay vì' is_a? '. –
foo.instance_of? String
hoặc
foo.kind_of? String
nếu bạn bạn o nly chăm sóc nếu nó được lấy từ String
một nơi nào đó lên chuỗi kế thừa của nó
Một cách tiếp cận vịt-gõ hơn sẽ nói
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à một hậu duệ thực tế của String, nhưng đối tượng chính nó là rất nhiều chuỗi giống như (stringy?)
Tuyệt. Trong trường hợp này, tôi tình cờ biết rằng 'foo' sẽ là' true', 'false', hoặc một chuỗi vani, nhưng tốt hơn là tìm hiểu các giải pháp tổng quát hơn. – davidchambers
kết hợp điều này với một cuộc gọi to_s sau khi kiểm tra xem đối tượng có phản hồi lại hay không và bạn đã nhận được một chuỗi! – seanmakesgames
@seanmakesgames Ý của bạn là 'to_str', hay' to_s'? Hai là hơi khác nhau. –
Ngoài các câu trả lời khác, Class xác định 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ĩ cách tốt hơn là tạo một số phương pháp dự đoán. Đ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
Con vịt hơn gõ cách;)
có gì sai với '" chuỗi ".is_a? (Chuỗi)'. 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', v.v ... Ý tưởng tồi để khỉ vá lớp' Object', chưa kể nó là vô dụng. – Mohamad
Tôi hoàn toàn đồng ý với bạn :) Nếu trọng tâm của bạn chỉ dựa trên các kiểu primitve và bạn biết rằng các yêu cầu dự án của bạn liên quan đến các kiểu nguyên thủy sẽ không bao giờ thay đổi (ok thường là trường hợp;)). Nhưng trong trường hợp các yêu cầu thay đổi tốt hơn để có một "Điểm kiểm soát duy nhất". Ví dụ trong môi trường dự án của bạn, bạn có rất nhiều kiểm tra trước (1000 trở lên). Bây giờ yêu cầu dự án của bạn sẽ thay đổi và mọi Chuỗi ký tự có ba ký tự trở lên không còn được định nghĩa là Chuỗi (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. – schlegel11
Nếu không biết ý định của câu hỏi, tôi sẽ nói cho hầu hết các tình huống lập trình trong thế giới thực, 'is_a? 'Thực sự là thành ngữ thích hợp hơn để sử dụng (và thường là kiểm tra gõ vịt giống như Andrew Grimm đề cập là tốt hơn). Một so sánh lớp nghiêm ngặt thường là một mùi mã. http: //en.wikipedia.org/wiki/Liskov_substitution_principle – mahemoff