В чем разница? Когда я должен использовать что? Почему их так много?
В чем разница? Когда я должен использовать что? Почему их так много?
Ответы:
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)
- Возвращает
true
ifobj
является экземпляром данного класса.
а также:
- - ( булево )
is_a?(class)
- ( булево )kind_of?(class)
- Возвращает
true
ifclass
является классом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 часто используются синонимичные методы, поэтому вы можете использовать тот, который звучит лучше. Это вопрос предпочтений. Отчасти это может быть связано с влиянием японцев: мне сказали, что они будут использовать разные слова для одного и того же числа в зависимости от предложения, чтобы оно звучало лучше. Мац, возможно, перенес эту идею в свой языковой дизайн.