Feature #8465

Proc set_binding

Added by Jacob Burkhart almost 2 years ago. Updated almost 2 years ago.

[ruby-core:55210]
Status:Rejected
Priority:Normal
Assignee:-

Description

=begin
(({instance_eval})) is a solution to evaluate a proc in the binding of another object

but it is not a solution for a (({Proc})) that takes arguments

I propose that in order to suppor this use-case we need (({Proc#set_binding}))

Example:

class BarFoo
def foo(arg)
"bar #{arg}"
end
def puts_a_foo
Proc.new do |arg|
puts self.foo(arg)
end
end
end

class FooFoo
def foo(arg)
"foo #{arg}"
end
def foo_foo_proc
Proc.new{}
end
end

foo_putter = BarFoo.new.puts_a_foo

foo_putter.call("blah")
# bar blah

FooFoo.new.instance_eval(&foo_putter)
#foo #FooFoo:0x007ff0b903f9b0

foo_putter.binding.eval("puts self.foo('blah')")
# bar blah

FooFoo.new.foo_foo_proc.binding.eval("puts self.foo('blah')")
# foo blah

#I expect...
foo_putter.set_binding(FooFoo.new.foo_foo_proc.binding)
foo_putter.call("blah")
#to output:
# foo blah
=end

History

#1 Updated by Jacob Burkhart almost 2 years ago

Oops, I meant that last line to say:

#I expect...
foo_putter.set_binding(FooFoo.new.foo_foo_proc.binding)
foo_putter.call("blah")
#to output:

foo blah

#2 Updated by Nobuyoshi Nakada almost 2 years ago

  • Description updated (diff)
  • Status changed from Open to Feedback

=begin
Try:

FooFoo.new.instance_exec('blah', &foo_putter)
=end

#3 Updated by Koichi Sasada almost 2 years ago

  • Status changed from Feedback to Rejected

Difficult to implement.

Also available in: Atom PDF