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:
parent
9040699aed
commit
1917719f00
1 changed files with 0 additions and 47 deletions
|
@ -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`
|
||||
--------------------
|
||||
|
||||
|
|
Loading…
Reference in a new issue