From a5c73abf11868ecf4f49cacf97bd4fdc40173dd4 Mon Sep 17 00:00:00 2001 From: jbranchaud Date: Wed, 29 Jul 2015 09:00:32 -0500 Subject: [PATCH] Add undef_method And The Inheritance Hierarchy as a ruby til. --- README.md | 1 + ...ef-method-and-the-inheritance-hierarchy.md | 52 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 ruby/undef-method-and-the-inheritance-hierarchy.md diff --git a/README.md b/README.md index 667055d..432e7bc 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,7 @@ smart people at [Hashrocket](http://hashrocket.com/). - [Question Mark Operator](ruby/question-mark-operator.md) - [Squeeze Out The Extra Space](ruby/squeeze-out-the-extra-space.md) - [Summing Collections](ruby/summing-collections.md) +- [`undef_method` And The Inheritance Hierarchy](ruby/undef-method-and-the-inheritance-hierarchy.md) ### tmux diff --git a/ruby/undef-method-and-the-inheritance-hierarchy.md b/ruby/undef-method-and-the-inheritance-hierarchy.md new file mode 100644 index 0000000..17accaa --- /dev/null +++ b/ruby/undef-method-and-the-inheritance-hierarchy.md @@ -0,0 +1,52 @@ +# `undef_method` And The Inheritance Hierarchy + +As the docs state, Ruby's +[`undef_method`](http://ruby-doc.org/core-2.2.0/Module.html#method-i-undef_method) + +> prevents the current class from responding to calls to the named method. + +This means you can do some weird things to the inheritance hierarchy. I'll +use the following code example to illustrate. + +```ruby +class Phone + def ring + puts 'brrrrriiing' + end +end + +class Smartphone < Phone + def ring + puts 'boop beep boop' + end +end + +class Iphone < Smartphone +end + +smartphone = Smartphone.new +iphone = Iphone.new + +smartphone.ring +#=> boop beep boop +iphone.ring +#=> boop beep boop +``` + +Everything works as expect. Now, I'll use `undef_method`. + +```ruby +class Smartphone + undef_method(:ring) +end + +smartphone.ring +#=> NoMethodError: undefined method `ring' for # +iphone.ring +#=> NoMethodError: undefined method `ring' for # +``` + +Not only have instances of `Smartphone` been prevented from responding to +`ring`, but any subclasses of `Smartphone` that call `ring` will get tripped +up when traversing the inheritance hierarchy in search of a definition of +`ring`.