• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

读代码学RUBY之闭包

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
#代码来源: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

  

来源:http://rubyer.me/blog/917  

首先,我们打开Array,并添加进iterate!方法。方法名以!结尾表示危险方法,引起注意。现在我们就可能像使用collect!一样使用iterate!

http://fuliang.iteye.com/blog/272370)。
5、数据中每个对象执行相同操作。

 

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 物件皆為冒號開頭,例如 :foo 或 :foo_bar。它的作用就是代表一個名字,最大的作用就是當做 Hash 的鍵 (key),例如{ :foo => 1, :bar => 2 },在這裡我們只需要一個識別的名字,不需要使用字串物件。使用 Symbol 寫法更簡潔和獲得效能上的好處。)

   2、:starting => Proc.new { puts "Starting" } 键KEY为 :starting,键VALUE为 一个Procs 过程。

   3、procs[:starting].call 直接调用 储存在 procs[:starting] 中的 Procs 过程

 BTW:什么时候用blocks而不用Procs呢?我一般这样判断:
1、Block:方法把一个对象拆分成很多片段,并且你希望你的用户可以与这些片段做一些交互。
2、Block:希望自动运行多个语句,如数据库迁移(database migration)。
3、Proc:希望多次复用一段代码。
4、Proc:方法有一个或多个回调方法(callbacks)。


未完,明天继续。

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
这两天的收获ruby篇发布时间:2022-07-13
下一篇:
在jruby下切换ruby的版本发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap