2011-10-13 24 views

Trả lời

149

Tôi nghĩ rằng bạn đang tìm kiếm instance_of?. is_a?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 
+6

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

16

Bạn có thể làm:

foo.instance_of?(String) 

Và tổng quát hơn:

foo.kind_of?(String) 
+3

Đ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

+2

@Davidchambers bạn nói đúng, 'kind_of?' là một từ đồng nghĩa cho 'is_a?'. – steenslag

+0

@davidchambers: Bạn nói đúng, ý tôi là 'instance_of? 'Thay vì' is_a? '. –

6
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ó

24

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?)

+0

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

+0

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

+1

@seanmakesgames Ý của bạn là 'to_str', hay' to_s'? Hai là hơi khác nhau. –

2

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.

  • o.class lớp o.
  • o.instance_of? c xác định xem o.class == c
  • o.is_a? c Có phải là một thể hiện của c hoặc bất kỳ phân lớp nào của nó?
  • o.kind_of? c từ đồng nghĩa cho * is_a? *
  • c === o cho lớp hoặc mô-đun, xác định xem * o.is_a? c * (Chuỗi === "s" trả về true)
0

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;)

+1

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

+0

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

Các vấn đề liên quan