Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #19662 from yui-knk/fix/bind
[ci skip] Remove Extensions to `Proc` section
  • Loading branch information
matthewd committed Apr 6, 2015
1 parent 3389033 commit 75f23c3
Showing 1 changed file with 0 additions and 47 deletions.
47 changes: 0 additions & 47 deletions guides/source/active_support_core_extensions.md
Expand Up @@ -3003,53 +3003,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`
--------------------

Expand Down

0 comments on commit 75f23c3

Please sign in to comment.