В чем разница? Когда я должен использовать что? Почему их так много?
ruby
inheritance
introspection
Клаудиу
источник
источник
is_a?
иkind_of?
существует, и я думаю: это часть философии дизайна Руби. Python сказал бы, что должен быть только один способ что-то сделать; В Ruby часто используются синонимичные методы, поэтому вы можете использовать тот, который звучит лучше. Это вопрос предпочтений. Отчасти это может быть связано с влиянием японцев: мне сказали, что они будут использовать разные слова для одного и того же числа в зависимости от предложения, чтобы оно звучало лучше. Мац, возможно, перенес эту идею в свой языковой дизайн.Ответы:
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?
отсутствует в ruby-1.9.2-p0. @ Клаудиу, нет.is_a?
это просто псевдонимkind_of?
. Оба метода вызывают одну и ту же функцию crb_obj_is_kind_of
.kind_of?
без переопределенияis_a?
.is_an?
метод ActiceSupport ?! Это не в текущей версии рельсов, и я не могу найти что-либо в Google о том, что это устарело.Из документации:
а также:
Если это неясно, было бы неплохо узнать, что именно неясно, чтобы можно было улучшить документацию.
Никогда. Используйте вместо этого полиморфизм.
Я бы не назвал два "многие". Их два, потому что они делают две разные вещи.
источник
Рубиноподобнее спрашивать объекты, отвечают ли они на метод, который вам нужен, или нет, используя
respond_to?
. Это позволяет как минимальный интерфейс, так и реализацию незаметного программирования.Конечно, это не всегда применимо, поэтому все еще есть возможность спросить о более консервативном понимании «типа», который является классом или базовым классом, используя методы, о которых вы спрашиваете.
источник
Я также не назвал бы два многие (
is_a?
иkind_of?
это псевдонимы одного и того же метода), но если вы хотите увидеть больше возможностей, обратите ваше внимание на#class
метод:источник