В чем разница? Когда я должен использовать что? Почему их так много?
В чем разница? Когда я должен использовать что? Почему их так много?
Ответы:
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? . Оба метода вызывают одну и ту же функцию c rb_obj_is_kind_of.
kind_of?без переопределения is_a?.
is_an?метод ActiceSupport ?! Это не в текущей версии рельсов, и я не могу найти что-либо в Google о том, что это устарело.
В чем разница?
Из документации:
- - ( логическое )
instance_of?(class)- Возвращает
trueifobjявляется экземпляром данного класса.
а также:
- - ( булево )
is_a?(class)
- ( булево )kind_of?(class)- Возвращает
trueifclassявляется классомobjили ifclassявляется одним из суперклассов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 сказал бы, что должен быть только один способ что-то сделать; В Ruby часто используются синонимичные методы, поэтому вы можете использовать тот, который звучит лучше. Это вопрос предпочтений. Отчасти это может быть связано с влиянием японцев: мне сказали, что они будут использовать разные слова для одного и того же числа в зависимости от предложения, чтобы оно звучало лучше. Мац, возможно, перенес эту идею в свой языковой дизайн.