在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
#代码来源:http://rubyer.me/blog/917顺便学习 Ruby的4种闭包:blocks, Procs, lambdas 和 Methods。 #first class Array def iterate! self.each_with_index do |n, i| self[i] = yield(n) yield(n) end end end array = [1, 2, 3, 4] array.iterate! do |x| x ** 2 end puts array.inspect # => [1, 4, 9, 16] #second class Array def iterate!(&code) #为iterate!传递一个参数&code,&表示这个参数是block。 self.each_with_index do |n,i| self[i] = code.call(n) #在iterate!中没有使用yield而是call。 end end end array.iterate! do |n| n ** 2 end puts array.inspect #third # ---PROC Procs 过程block与Proc惟一的不同是:block是不能保存的Proc,一次性的。 square = Proc.new do |n| n ** 2 end class Array def iterate!(code) #now these is not &code, not null, but code !! #注意:并没有在 iterate!的参数头部添加&,因为Proc只是一个普通类,不需要特殊处理。 self.each_with_index do |n, i| self[i] = code.call(n) end end end array.iterate! square puts array.inspect
首先,我们打开Array,并添加进iterate!方法。方法名以!结尾表示危险方法,引起注意。现在我们就可能像使用collect!一样使用iterate! http://fuliang.iteye.com/blog/272370)。
def callbacks(procs) procs[:starting].call puts "Still going" procs[:finishing].call end callbacks(:starting => Proc.new { puts "Starting" }, :finishing => Proc.new { puts "Finishing" }) # => Starting # => Still going # => Finishing 1、(:starting => Proc.new { puts "Starting" }, :finishing => Proc.new { puts "Finishing" } ) 这里定义了一个哈希表或者说字串符號 (Symbol) 。(一個 Symbol 物件皆為冒號開頭,例如 2、:starting => Proc.new { puts "Starting" } 键KEY为 :starting,键VALUE为 一个Procs 过程。 3、procs[:starting].call 直接调用 储存在 procs[:starting] 中的 Procs 过程 BTW:什么时候用blocks而不用Procs呢?我一般这样判断: 未完,明天继续。
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论