- 論壇徽章:
- 0
|
ruby block的用途和理解
lambdarubyrspec
在論壇討論問題,自己寫體會(huì)抄回來
常用到的場(chǎng)合:
1. scope 當(dāng)需要?jiǎng)討B(tài)參數(shù)時(shí)
Ruby代碼- scope :aged_0, lambda{ where("created_at IS NULL OR created_at < ?", Date.today + 30.days).joins(:owner) }
- scope :aged_1, lambda{ |d_time|where("created_at IS NULL OR created_at < ?", d_time).joins(:owner) }
- scope :aged_0, lambda{ where("created_at IS NULL OR created_at < ?", Date.today + 30.days).joins(:owner) }
- scope :aged_1, lambda{ |d_time|where("created_at IS NULL OR created_at < ?", d_time).joins(:owner) }
復(fù)制代碼 2. rspec測(cè)試
Ruby代碼- lambda{post :create, :user => @attr}.should_not change(User, :count)
- lambda{post :create, :user => @attr}.should_not change(User, :count)
復(fù)制代碼 參考文獻(xiàn),很多推薦
http://www.robertsosinski.com/20 ... -procs-and-lambdas/
http://augustl.com/blog/2008/pro ... nonymous_functions/
block本質(zhì)是匿名方法,和hash loop class recursion一樣就是一個(gè)編程的工具,沒有的話程序都可以寫,就是特別的場(chǎng)合,有特別適用的地方。
那么,block匿名方法什么時(shí)候適用呢?方便理解也舉個(gè)例子吧,
有兩組數(shù)據(jù),可能要進(jìn)行不同處理
Ruby代碼- def cross_loop(array_a, array_b, process)
- array_a.each do |element_a|
- array_b.each do |element_b|
- process.call(element_a, element_b)
- end
- end
- end
-
- cross_loop([1,2,3], [3,4,5], lambda{|x,y| puts x + y})
- cross_loop([1,2,3], [3,4,5], lambda{|x,y| puts x * y})
- def cross_loop(array_a, array_b, process)
- array_a.each do |element_a|
- array_b.each do |element_b|
- process.call(element_a, element_b)
- end
- end
- end
- cross_loop([1,2,3], [3,4,5], lambda{|x,y| puts x + y})
- cross_loop([1,2,3], [3,4,5], lambda{|x,y| puts x * y})
復(fù)制代碼 說不用lambda行不行,當(dāng)然,最基本可以在cross_loop里面調(diào)用一個(gè)函數(shù)。只不過重用的時(shí)候不好,因?yàn)闆]有process的參數(shù)。
當(dāng)然,也可以不用lambda又動(dòng)態(tài)傳入process,寫個(gè)process.call然后,再寫些process函數(shù)也可以。
Ruby代碼- def cross_loop(array_a, array_b, process)
- array_a.each do |element_a|
- array_b.each do |element_b|
- self.send(process, element_a, element_b)
- end
- end
- end
- def plus(a, b); puts a + b; end
- def multiply(a, b); puts a * b; end
- cross_loop([1,2,3], [3,4,5], 'plus')
- cross_loop([1,2,3], [3,4,5], 'multiply')
- def cross_loop(array_a, array_b, process)
- array_a.each do |element_a|
- array_b.each do |element_b|
- self.send(process, element_a, element_b)
- end
- end
- end
- def plus(a, b); puts a + b; end
- def multiply(a, b); puts a * b; end
- cross_loop([1,2,3], [3,4,5], 'plus')
- cross_loop([1,2,3], [3,4,5], 'multiply')
復(fù)制代碼 |
|