Ruby中使用yield语句调用block时可以带有参数,参数值见传送个相关联的block。如果传给block的参数是已经存在的局部变量,那么这些变量即为block的参数,他们的值可能会因block的执行而改变。
同样的规则也适用于block内的变量:如果他们第一次出现在block内,那么他们就是block的局部变量。相反,如果他们第一次出现在block外,那么block就与其外部环境共享这些变量。
例如:
a =[4,2] b ='cat' c =1 a.each{|b| c = b*a[1] d = c+2 } p a =>[4,2] p b =>2 p c =>8 pdefined?(d)=>nil
b和c都是block外部的局部变量,b作为block的参数,c是block内的变量,block与外部环境共享这些变量,它们的值因block的执行而改变;
d是block内部局部变量,只在block内部有效