常常瞎折腾时遇到一个情况,让 proc 在一个 obj 的环境下执行
这个了解元编程的都知道
class A def initialize(val) @val = val end end p = Proc.new { @val + 123 } A.new(123).instance_eval(&p) # => 246
但是,这样不能传参数啊!不能传参啊!!
才发现还有#instance_exec 方法,感谢 2、3、4 楼的同学:)
a = Proc.new{|s| puts s} a.call(1)
BasicObject#instance_exec
instance_exec
这样传参 :
b = ->(*a) { @val + a[0] + a[1] + a[2] + 123 } # 或单参数时 : b = proc {|a| @val + a + 123} A.new(123).instance_exec(10000, 1000, 100, &b) #=> 11346
如 RSpec 里面就有这样的用法: https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/hooks.rb#L387
#RSpec::Core::Hooks::AroundHook#execute_with: def execute_with(example, procsy) example.instance_exec(procsy, &block) # <= return if procsy.executed? Pending.mark_skipped!(example, "#{hook_description} did not execute the example") end
@lululau @cicholgricenchos @chanshunli 常在文档时看到这个方法但确被我忽略了。。。。。 多谢各位:)