Яка різниця? Коли я повинен використовувати який? Чому їх так багато?
Яка різниця? Коли я повинен використовувати який? Чому їх так багато?
Відповіді:
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 би сказав, що існує лише один спосіб зробити щось; У Рубі часто є синонімічні методи, тому ви можете використовувати той, який звучить краще. Це питання переваги. Частково це може бути пов’язано з японським впливом: мені кажуть, що вони використовуватимуть інше слово для однієї і тієї ж кількості, залежно від речення, щоб зробити це красивішим. Матц, можливо, вніс цю ідею у свій мовний дизайн.