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:
@@ -117,6 +117,7 @@ smart people at [Hashrocket](http://hashrocket.com/).
|
|||||||
- [Question Mark Operator](ruby/question-mark-operator.md)
|
- [Question Mark Operator](ruby/question-mark-operator.md)
|
||||||
- [Squeeze Out The Extra Space](ruby/squeeze-out-the-extra-space.md)
|
- [Squeeze Out The Extra Space](ruby/squeeze-out-the-extra-space.md)
|
||||||
- [Summing Collections](ruby/summing-collections.md)
|
- [Summing Collections](ruby/summing-collections.md)
|
||||||
|
- [`undef_method` And The Inheritance Hierarchy](ruby/undef-method-and-the-inheritance-hierarchy.md)
|
||||||
|
|
||||||
### tmux
|
### tmux
|
||||||
|
|
||||||
|
|||||||
52
ruby/undef-method-and-the-inheritance-hierarchy.md
Normal file
52
ruby/undef-method-and-the-inheritance-hierarchy.md
Normal 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`.
|
||||||
Reference in New Issue
Block a user