Яка різниця? Коли я повинен використовувати який? Чому їх так багато?
Яка різниця? Коли я повинен використовувати який? Чому їх так багато?
Відповіді:
kind_of?і is_a?є синонімами.
instance_of?відрізняється від двох інших тим, що повертається лише в тому випадку, trueякщо об'єкт є екземпляром цього точного класу, а не підкласом.
Приклад:
"hello".is_a? Objectі "hello".kind_of? Objectповертаємось trueтому, що "hello"є Stringі Stringє підкласом Object."hello".instance_of? Objectповертається false.@honda.kind_of? Carі @person.is_a? Administrator, Рубі, все про естетику. Насправді помічайте граматичну помилку ... при активній підтримці ви можете написати @person.is_an? Administrator:) ... Це, можливо, вже перетворилося на ядро Ruby.
kind_of?але ні is_a??
is_an?не знаходиться в рубіні-1.9.2-p0. @Claudiu, ні. is_a?це лише псевдонімkind_of? . Обидва методи ВИКЛИК тієї ж функції з, rb_obj_is_kind_of.
kind_of?не змінюючи їх is_a?.
is_an?метод ActiceSupport ?! Його немає в поточній версії рейок, і я не можу знайти нічого в Google про те, що це також застаріло.
Яка різниця?
З документації:
- - ( Булева )
instance_of?(class)- Повертає,
trueякщоobjце екземпляр даного класу.
і:
- - ( булева )
is_a?(class)
- ( булева )kind_of?(class)- Повертає,
trueякщоclassце класobj, або якщоclassце один із надкласівobjабо модулів, що входять до складуobj.
Якщо це незрозуміло, було б непогано знати, що саме незрозуміло, щоб документацію можна було покращити.
Коли я повинен використовувати який?
Ніколи. Використовуйте замість цього поліморфізм.
Чому їх так багато?
Я б не назвав двох "багатьох". Їх є дві, бо вони роблять дві різні речі.
Рубійнішим чином задається питання про те, чи відповідають вони потрібному вам методу чи ні, використовуючи respond_to?. Це дозволяє як мінімальний інтерфейс, так і впровадження невідомого програмування.
Це не завжди застосовується, звичайно, тому все ще існує можливість запитати про більш консервативне розуміння "типу", що є класом або базовим класом, використовуючи методи, про які ви питаєте.
Я також не закликав би два ( is_a?і kind_of?псевдоніми одного і того ж методу), але якщо ви хочете побачити більше можливостей, зверніть свою увагу на #classметод:
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?іkind_of?є: я вважаю , що це частина філософії дизайну Рубі. Python би сказав, що існує лише один спосіб зробити щось; У Рубі часто є синонімічні методи, тому ви можете використовувати той, який звучить краще. Це питання переваги. Частково це може бути пов’язано з японським впливом: мені кажуть, що вони використовуватимуть інше слово для однієї і тієї ж кількості, залежно від речення, щоб зробити це красивішим. Матц, можливо, вніс цю ідею у свій мовний дизайн.