块的目的是什么?

时间:2012-09-11 23:09:35

标签: ruby

我刚刚开始使用红宝石,无法将头部缠绕在块上

它与匿名函数有什么不同?

我想在哪个实例上使用它?

我何时会通过匿名函数选择它?

1 个答案:

答案 0 :(得分:4)

Ruby 没有像JavaScript这样的匿名函数(例如)。块有3个基本用途:

  1. 创建Proc s
  2. 创建lambdas
  3. 有功能
  4. 这里的块类似于匿名函数的示例(Ruby和JavaScript)。

    红宝石:

    [1,2,3,4,5].each do |e| #do starts the block
      puts e
    end #end ends it
    

    JS(jQuery):

    $.each([1,2,3,4,5], function(e) { //Anonymous *function* starts here
      console.log(e);
    }); //Ends here
    

    Ruby块(和匿名函数)的强大之处在于它们可以传递给任何方法(包括您定义的方法)。因此,如果我想要我自己的每个方法,这里是如何做到的:

    class Array
      def my_each
        i = 0
        while(i<self.length)
          yield self[i]
          i+=1
        end
      end
    end
    

    例如,当您声明一个这样的方法时:

    def foo(&block)
    end
    

    block是表示传递的块的Proc对象。所以Proc.new可能看起来像这样:

    def Proc.new(&block)
      block
    end
    

    必要时,块绑定到方法。它们只能通过我上面描述的方法变成对象。虽然我不确定lambda的确切实现(它会进行额外的arg检查),但它的想法是一样的。

    因此,块的基本思想是:绑定到方法的代码块,可以通过Proc参数包含在&对象中,也可以由{调用{1}}关键字。