- 論壇徽章:
- 0
|
本帖最后由 feiyang10086 于 2012-03-06 11:47 編輯
ruby block的用途和理解
lambdarubyrspec
在論壇討論問題,自己寫體會抄回來
常用到的場合:
1. scope 當需要動態(tài)參數(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) }
復制代碼 2. rspec測試
Ruby代碼- lambda{post :create, :user => @attr}.should_not change(User, :count)
- lambda{post :create, :user => @attr}.should_not change(User, :count)
復制代碼 參考文獻,很多推薦
http://www.robertsosinski.com/20 ... -procs-and-lambdas/
block本質是匿名方法,和hash loop class recursion一樣就是一個編程的工具,沒有的話程序都可以寫,就是特別的場合,有特別適用的地方。
那么,block匿名方法什么時候適用呢?方便理解也舉個例子吧,
有兩組數(shù)據(jù),可能要進行不同處理
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})
復制代碼 說不用lambda行不行,當然,最基本可以在cross_loop里面調用一個函數(shù)。只不過重用的時候不好,因為沒有process的參數(shù)。
當然,也可以不用lambda又動態(tài)傳入process,寫個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'
復制代碼 )
|
|