1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

[ci skip] Remove Extensions to Proc chapter section

`Proc#bind` is removed with 4.1 release
This commit is contained in:
yui-knk 2015-04-06 08:37:27 +09:00
parent 9040699aed
commit 1917719f00

View file

@ -3040,53 +3040,6 @@ The method `Range#overlaps?` says whether any two given ranges have non-void int
NOTE: Defined in `active_support/core_ext/range/overlaps.rb`.
Extensions to `Proc`
--------------------
### `bind`
As you surely know Ruby has an `UnboundMethod` class whose instances are methods that belong to the limbo of methods without a self. The method `Module#instance_method` returns an unbound method for example:
```ruby
Hash.instance_method(:delete) # => #<UnboundMethod: Hash#delete>
```
An unbound method is not callable as is, you need to bind it first to an object with `bind`:
```ruby
clear = Hash.instance_method(:clear)
clear.bind({a: 1}).call # => {}
```
Active Support defines `Proc#bind` with an analogous purpose:
```ruby
Proc.new { size }.bind([]).call # => 0
```
As you see that's callable and bound to the argument, the return value is indeed a `Method`.
NOTE: To do so `Proc#bind` actually creates a method under the hood. If you ever see a method with a weird name like `__bind_1256598120_237302` in a stack trace you know now where it comes from.
Action Pack uses this trick in `rescue_from` for example, which accepts the name of a method and also a proc as callbacks for a given rescued exception. It has to call them in either case, so a bound method is returned by `handler_for_rescue`, thus simplifying the code in the caller:
```ruby
def handler_for_rescue(exception)
_, rescuer = Array(rescue_handlers).reverse.detect do |klass_name, handler|
...
end
case rescuer
when Symbol
method(rescuer)
when Proc
rescuer.bind(self)
end
end
```
NOTE: Defined in `active_support/core_ext/proc.rb`.
Extensions to `Date`
--------------------