Ruby 一些 proc 的魔法

xjz19901211 · 2015年06月03日 · 最后由 xjz19901211 回复于 2015年06月05日 · 1603 次阅读

常常瞎折腾时遇到一个情况,让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楼的同学 :)

共收到 5 条回复
a = Proc.new{|s| puts s}
a.call(1)

BasicObject#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 常在文档时看到这个方法但确被我忽略了。。。。。 多谢各位 :)

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册