1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-03 07:08:01 +00:00

Add undef_method And The Inheritance Hierarchy as a ruby til.

This commit is contained in:
jbranchaud
2015-07-29 09:00:32 -05:00
parent 1e4ddfc8b0
commit a5c73abf11
2 changed files with 53 additions and 0 deletions

View File

@@ -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

View File

@@ -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 #<Smartphone:0x007fd0a20b7960>
iphone.ring
#=> NoMethodError: undefined method `ring' for #<Iphone:0x007fd0a20b7938>
```
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`.