Sự khác biệt là gì? Khi nào nên sử dụng? Tại sao có rất nhiều trong số họ?
Sự khác biệt là gì? Khi nào nên sử dụng? Tại sao có rất nhiều trong số họ?
Câu trả lời:
kind_of?
và is_a?
đồng nghĩa.
instance_of?
khác với hai cái còn lại ở chỗ nó chỉ trả về true
nếu đối tượng là một thể hiện của lớp chính xác đó, không phải là lớp con.
Thí dụ:
"hello".is_a? Object
và "hello".kind_of? Object
trả về true
vì "hello"
là một String
và String
là một lớp con của Object
."hello".instance_of? Object
trả lại false
.@honda.kind_of? Car
và @person.is_a? Administrator
, tất cả về thẩm mỹ của Ruby. Trên thực tế, hãy chú ý đến lỗi ngữ pháp ... với sự hỗ trợ tích cực mà bạn có thể viết @person.is_an? Administrator
:) ... Điều đó có thể đã biến nó thành lõi Ruby ngay bây giờ, thực sự.
kind_of?
nhưng không is_a?
?
is_an?
không có trong ruby-1.9.2-p0. @Claudiu, không. is_a?
chỉ là một bí danh củakind_of?
. Cả hai phương thức đều gọi hàm c giống nhau , rb_obj_is_kind_of
.
kind_of?
mà không ghi đè is_a?
.
is_an?
Phương thức ActiceSupport này ở đâu?! Đây không phải là phiên bản đường ray hiện tại và tôi không thể tìm thấy bất cứ điều gì trên google về việc nó bị phản đối.
Sự khác biệt là gì?
Từ tài liệu:
- - ( Boolean )
instance_of?(class)
- Trả
true
nếuobj
là một thể hiện của nhóm nhất định.
và:
- - ( Boolean )
is_a?(class)
- ( Boolean )kind_of?(class)
- Lợi nhuận
true
nếuclass
là lớpobj
, hoặc nếuclass
là một trong những superclasses củaobj
hoặc mô-đun bao gồm trongobj
.
Nếu điều đó không rõ ràng, thật tốt khi biết chính xác những gì không rõ ràng, để tài liệu có thể được cải thiện.
Khi nào nên sử dụng?
Không bao giờ. Sử dụng đa hình thay thế.
Tại sao có rất nhiều trong số họ?
Tôi sẽ không gọi hai "nhiều". Có hai người trong số họ, vì họ làm hai việc khác nhau.
Nó giống như Ruby hơn khi hỏi các đối tượng xem họ có đáp ứng với một phương thức bạn cần hay không, bằng cách sử dụng respond_to?
. Điều này cho phép cả giao diện tối thiểu và thực hiện lập trình không biết.
Tất nhiên không phải lúc nào cũng có thể áp dụng, do đó vẫn có khả năng hỏi về cách hiểu bảo thủ hơn về "loại", đó là lớp hoặc lớp cơ sở, sử dụng các phương thức bạn hỏi về.
Tôi cũng sẽ không gọi hai nhiều ( is_a?
và kind_of?
là bí danh của cùng một phương thức), nhưng nếu bạn muốn xem nhiều khả năng hơn, hãy chuyển sự chú ý của bạn sang #class
phương thức:
A = Class.new
B = Class.new A
a, b = A.new, B.new
b.class < A # true - means that b.class is a subclass of A
a.class < B # false - means that a.class is not a subclass of A
# Another possibility: Use #ancestors
b.class.ancestors.include? A # true - means that b.class has A among its ancestors
a.class.ancestors.include? B # false - means that B is not an ancestor of a.class
is_a?
vàkind_of?
tồn tại: Tôi cho rằng đó là một phần trong triết lý thiết kế của Ruby. Python sẽ nói rằng chỉ nên có một cách để làm một cái gì đó; Ruby thường có các phương thức đồng nghĩa để bạn có thể sử dụng phương thức nghe hay hơn. Đó là một vấn đề ưu tiên. Một phần có thể là do ảnh hưởng của Nhật Bản: Tôi được cho biết rằng họ sẽ sử dụng một từ khác cho cùng một số tùy thuộc vào câu để làm cho âm thanh hay hơn. Matz có thể đã mang ý tưởng đó vào thiết kế ngôn ngữ của mình.