8.3. Weryfikacja funkcjonalności obiektu

Problem

Chcemy sprawdzić, czy dany obiekt przydatny jest do określonych zastosowań.

Rozwiązanie

Jeśli chcesz wywoływać określoną metodę w stosunku do obiektu, sprawdź, czy obiekt na to wywołanie odpowiada:

def send_as_package(obj)
  if obj.respond_to? :package
    packaged = obj.package
  else
    if $DEBUG
      $stderr.puts "Nie wiem, jak spakować klasę #{obj.class}."
      $stderr.puts 'Spróbuj użyć rodzimego packagera.'
    end
    package = Package.new(obj)
  end
  send(package)
end

Jeśli natomiast obiekt musi być obiektem określonej klasy lub wykorzystywać musi kod określonego modułu, użyj predykatu is_a?:

def multiply_precisely(a, b) if a.is_a? Float or b.is_a? Float raise ArgumentError, "Nie da się precyzyjnie pomnożyć ...

Get Ruby. Receptury now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.