ruby编程语言-ruby闭包
作者:gcbeen
日期:2013年10月06日
一、什么是闭包
闭包是能够读取其他函数内部变量的函数(或者语法)。
def multiply(data, n)
data.collect {|x| x*n}
end
puts multiply([1,2,3], 2)
代码块变成一个proc或者lambda
def multiply(n)
lambda {|data| data.collect {|x| x*n} }
end
doubler = multiplier(2)
puts doubler.call([1,2,3])
二、函数的内部变量始终保存在内存中
def accessor_pair(initialValue = nil)
value = initialValue
getter = lambda { value}
setter = lambda {|x| value = x }
return getter, setter
end
getX, setX = accessor_pair(0)
puts getX[]
setX[10]
puts getX[]
在ruby1.8中,代码块参数并不总是限定在代码块内访问。
def multiply(*args)
x = nil
args.map {|x| lambda {|y| x*y } } #在ruby1.9中代码块的参数仅在代码块可见。
end
double, triple = multipliers(2, 3)
puts double.call(2) # prints 6 in Ruby 1.8
如果在循环中创建lambda,并在lambda中使用一个循环变量(比如数组索引),这个循环变量还是会在代码块外访问的。
def multipliers(*args)
x = nil
for x in args
lambda {|y| x*y }
end
end
double, triple = multipliers(2, 3)
puts double.call(2) # prints 6 in ruby 1.8, 1.9
三、绑定
def multiplier(n)
lambda {|data| data.collect {|x| x*n } }
end
doubler = multiplier(2)
puts doubler.call([1, 2, 3])
eval("n=3", doubler.binding) #或者 doubler.binding.eval("n=3")
puts doubler.call([1, 2, 3])
blog comments powered by Disqus