A bit more useful then just determining the class of an object is to see if an object responds to a specific method. This is a form of polymorphism for dynamically typed languages, where for example a method could take in any object so long as that object responds to a call on
Implements a given interface could probably be interpreted a few ways, for example you might wonder in Ruby if a given class includes a specific mixin. Or in Python, which supports multiple inheritance, all the parent classes a given class descends from. There are ways to do just that in both, if that is what you need.
What I want to look at today though is specifically if a given name is callable on a given object. This is a bit of a lowest common denominator approach - it wouldn’t matter if an object acquired that method via inheritance, mixin, or direct implementation.
The way to do this in Ruby is well known:
1 2 3
Looks like Python has a very approximate way to do this, though its split into two steps:
1 2 3
hasattr only tells you that
object1 has an attribute named
capitalize, it doesn’t yet tell you if you can call that attribute like a method. I believe as an alternative you can jump right to
callable and just be ready to trap an
Dart is not quite so cut and dry as the two examples above. This is because Dart, while having the option of being dynamically typed, has a bit more of a classical type system then Python or Ruby. By this I mean you have the option in Dart to be more explicit that a specific class implements a specific interface. It supports abstract classes, inheritance and mixins. It also supports strong typing on method invocation, so the need to query an object to insure it implements a specific method probably is not needed. You can even make the type you check against in the method declaration be an interface or parent class, again, as with a more traditional, strong type system.
But, for sake of 1:1, let us see if we can figure out if an object supports calling a specific method on it:
1 2 3 4 5 6 7
That said, Dart’s
is keyword seems pretty useful, as it checks if an object implements a specified interface:
1 2 3 4 5 6 7
Again, because Dart has a bit more classical idea of “interface”, this seems more useful to me then for example detecting if a Ruby class includes a specified module.