`

ruby block的用途和理解

阅读更多
在论坛讨论问题,自己写体会抄回来

常用到的场合:
1. scope 当需要动态参数时
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测试
lambda{post :create, :user => @attr}.should_not change(User, :count)


参考文献,很多推荐
http://www.robertsosinski.com/2008/12/21/understanding-ruby-blocks-procs-and-lambdas/

http://augustl.com/blog/2008/procs_blocks_and_anonymous_functions/


block本质是匿名方法,和hash loop class recursion一样就是一个编程的工具,没有的话程序都可以写,就是特别的场合,有特别适用的地方。
那么,block匿名方法什么时候适用呢?方便理解也举个例子吧,
有两组数据,可能要进行不同处理

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里面调用一个函数。只不过重用的时候不好,因为没有process的参数。
当然,也可以不用lambda又动态传入process,写个process.call然后,再写些process函数也可以。

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')


只是跟block比,各有所长吧
http://innig.net/software/ruby/closures-in-ruby
分享到:
评论
1 楼 ruby_windy 2012-03-07  

相关推荐

    ruby+voodoo

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法著称。Voodoo,通常指的是在软件工程中用于实现...通过深入学习和理解Ruby语言以及Voodoo框架,开发者能够提升工作效率,同时享受到Ruby的编程乐趣。

    Ruby编程语言教学资源压缩包

    Ruby编程语言,是一种面向对象的、动态类型的脚本语言,由日本人松本行弘于1995年设计并开发。它以其简洁、优雅的语法和强大的功能深受开发者喜爱,尤其...请确保在学习过程中结合实际操作,以加深理解和提高应用能力。

    Ruby语言中文教程

    此外,Ruby的块(Block)、proc(过程)和lambda(λ函数)提供了强大的匿名函数和闭包功能,使得代码更加简洁且易于理解。 Ruby的标准库非常丰富,包含大量实用的模块和工具,例如文件和目录操作、网络通信、日期...

    ruby入门简单demo,学习练习编程语言

    Ruby的语法结构清晰,易于理解和编写,非常适合初学者入门。 Ruby的核心特性包括: 1. 面向对象:Ruby是一种完全的面向对象语言,每一个数据都是一个对象,包括基本类型如整数、字符串和布尔值。这意味着你可以对...

    Ruby中的return、break、next详解

    在Ruby编程语言中,`return`、`break`和`next`是三个关键的控制流程语句,它们各自有着特定的用途,特别是在处理代码块(如循环和块方法)时。下面将详细介绍这三个关键字的工作原理及其区别。 1. `return` `return...

    LearnRuby:学习ruby的文件

    4. **块和闭包**:Ruby中的块(Block)是一种内联函数,可以通过`do..end`或`{..}`定义,与匿名函数(Proc)和lambda类似,它们都是闭包,可以捕获并保持定义时的上下文。 5. **模块和混合**:Ruby的模块(Module)...

    ruby_crash_week

    在"ruby_crash_week"的学习旅程中,你将逐步熟悉并掌握这些概念,通过实践项目和练习巩固理解。记得理论结合实践,多写代码,多思考,你将在短时间内对Ruby有深入的认识。祝你学习顺利,快速掌握Ruby编程!

    Ruby元编程之梦中情人method_missing方法详解

    然而,过度依赖`method_missing`可能导致代码难以理解和维护,因此应谨慎使用,并优先考虑使用`define_method`等替代方案。 总的来说,理解何时和如何使用`method_missing`和`define_method`是掌握Ruby元编程的关键...

    Ruby编程中关于中断和返回的用法教程

    在Ruby编程中,中断和返回是...总的来说,`return`、`break`和`next`在Ruby中都有各自独特的用途,它们在控制程序流和处理循环中断方面扮演着重要角色。理解这些关键字的区别对于编写清晰、高效的Ruby代码至关重要。

    Classwork

    4. **块(Block)、 Proc 和 Lambda**:Ruby支持块,这是一种可以包含一组语句的结构,通常与迭代器配合使用。Proc和Lambda是Ruby中的函数对象,它们可以存储代码块并在需要时执行。理解三者之间的区别和使用场景...

    TPG

    3. **块、 Proc 和 Lambda**:Ruby 提供了块(block),一种代码段,常用于迭代器。Proc 和 Lambda 是可存储的代码块,可以作为参数传递,它们在行为上与块类似但有一些关键区别,如 Proc 不会检查上下文的返回语句...

    坑人

    标题中的“坑人”可能是指在编程...以上就是Ruby编程中可能遇到的一些“坑人”知识点,每个都值得深入理解和掌握,以便写出更高效、更健壮的代码。在学习过程中,不断实践和查阅文档是避免掉入这些“坑”的有效方法。

    晚安

    它的设计理念是让编程变得更加简单和愉快,使得代码更易于理解和维护。 在"anightinjapan-master"这个压缩包文件中,我们可以推测这可能是一个开源项目,以"AnightinJapan"为名,可能是关于日本文化、旅行或某种...

    j-enum:Enumerable 和 Enumerator 的实现

    在Ruby编程语言中,Enumerable模块和Enumerator类是两个非常核心且强大的工具,它们为处理集合数据提供了丰富的功能。本文将深入探讨这两个概念的实现、用途以及如何在实际编程中运用它们。 首先,Enumerable模块是...

Global site tag (gtag.js) - Google Analytics