我刚刚开始使用红宝石,无法将头部缠绕在块上
它与匿名函数有什么不同?
我想在哪个实例上使用它?
我何时会通过匿名函数选择它?
答案 0 :(得分:4)
Ruby 没有像JavaScript这样的匿名函数(例如)。块有3个基本用途:
Proc
s 这里的块类似于匿名函数的示例(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}}关键字。