Ruby Block 调用问题

ytwman · 2011年11月27日 · 最后由 ytwman 回复于 2012年02月04日 · 3552 次阅读
def method(g)
  yield(g)
  puts g
end

method("safdsa") {|x| puts x, x = "test"}

上面代码执行后打印结果: safdsa test safdsa 请问下这是为何?

先从简单的开始解释

a = 'foo'
puts a, a = 'bar'
foo
bar
=> nil

这个解释了第一行和第二行的结果。

第三行直接打印出来传入method方法的参数,那是因为 yield 方法调用的闭包内对变量 g 作的任何赋值,仅仅在闭包作用域内有效。

block variable scope 的问题。在 1.9 中你还可以这样使用(注意 “x” 前面的 “;” 符号):

method("safdsa") {|;x| puts x, x = "test"}

这样可以禁止 block 内调用非 scope 内的 variable。

#1 楼 @lgn21st 多谢,理解了,同时打印了两个参数。

#2 楼 @fredwu 这样"safdsa"都传不到 block 里面去啦!不能这么用嘀

#1 楼 @lgn21st 如果要想修改 method 方法内部的变量 g 是不是需要把 block 转化为 proc?麻烦介绍下。嘿嘿。

#5 楼 @ytwman 我的建议是不要这么作,只在 block 内部使用修改过的变量"g"。如果让 block 内部去改变外部的变量,这样可能会造成各种问题而且让调试的人无法把持~

ruby-1.9.2-p290 :001 > p 'foo','bar' "foo" "bar" => ["foo", "bar"]

#7 楼 @wxianfeng lgn21st 的回复已经明白了,最近又接着看了下书,block 可以修改外部定义好的变量。帖子给予关闭吧。

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