Ruby proc 中可以改变外部变量的值吗?

tablecell · October 04, 2021 · Last by tablecell replied at October 05, 2021 · 255 hits
def call_proc(proc)
  count = 500
 #   proc.call count
  count.tap { |count|
    puts count
    proc.call count
    puts count
  }

  puts count
end

myproc = Proc.new { |&param|
  param = 200

  "balabala"
}

call_proc(myproc)

除了 proc 最后返回一个包含 param 的 array 还有其他方法吗?

param = 200 给 param 赋予了一个新的 object,所以没有改变 count 的值。

Integer 类型不能改变自身,要用一些可以改变自身的类型,例如 Hash 或者自己创建一个类:

data = { count: 500 }

proc = Proc.new { |params|
  params[:count] = 200
}

proc.call(data)

puts data[:count]
#=> 200

可以用 set_trace_func 获取外部 binding,然后 eval

Reply to mizuhashi

加了这个 print 就停不下来,只是想在 call_proc 中使用,对其他代码无影响

You need to Sign in before reply, if you don't have an account, please Sign up first.