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 作的任何赋值,仅仅在闭包作用域内有效。
method
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 可以修改外部定义好的变量。帖子给予关闭吧。