Я буду використовувати python як приклад того, що я шукаю (ви можете вважати це псевдокодом, якщо ви не знаєте Python):
>>> a = 1
>>> type(a)
<type 'int'>
Я знаю, що в ruby я можу зробити:
1.9.3p194 :002 > 1.class
=> Fixnum
Але чи правильно так визначати тип об'єкта?
Правильним способом визначення &quo ;типу&quo ; об'єкта, що є хитким терміном у світі Ruby, є виклик &quo ;об'єкт.класу&quo ;.
Оскільки класи можуть успадковувати від інших класів, якщо ви хочете визначити, чи є об'єкт &quo ;певного типу&quo ;, ви можете викликати object.is_a?(ClassName)
, щоб побачити, чи object
має тип ClassName
або є похідним від нього.
Зазвичай перевірка типу не виконується в Ruby, але замість цього об'єкти оцінюються на основі їх здатності реагувати на певні методи, що зазвичай називається "Качина типізація". Іншими словами, якщо об'єкт реагує на потрібні вам методи, немає ніяких підстав бути впевненим у його типі.
Наприклад, object.is_a?(String)
є занадто жорстким, оскільки інший клас може реалізувати методи, які перетворять його в рядок, або змусять його поводитися ідентично тому, як поводиться String. object.respond_to?(:to_s)
був би кращим способом перевірити, що даний об'єкт робить те, що ви хочете.
ти теж можеш спробувати: інстанція_з
p 1.instance_of? Fixnum #=> True
p "1".instance_of? String #=> True
p [1,2].instance_of? Array #=> True
Часто в Ruby вам насправді не важливо, який клас об'єкта, вам просто важливо, щоб він реагував на певний метод. Це називається Duck Typing, і ви побачите це у всіх видах кодових баз Ruby.
Тому в багатьох (якщо не в більшості) випадках найкраще використовувати качину типізацію, використовуючи #respond_to?(метод)
:
object.respond_to?(:to_i)