在我的千行Ruby之旅中,我对匿名函数的概念非常困难。维基百科says something about在代码中有一些无名的灵魂,它提交到更高的顺序,但我的理解在那里结束。
或者换句话说,我(如果我理解的话)将如何向我母亲解释匿名函数?
答案 0 :(得分:14)
匿名函数具有以下特征:
答案 1 :(得分:12)
以下是Ruby中匿名函数的一个示例(在本例中称为块):
my_array.each{ |item| puts item }
上面的匿名函数在哪里?为什么,它是接收单个参数的那个,将其命名为“item”,然后将其打印出来。在JavaScript中,上面的内容可能写成......
Array.prototype.each = function(anon){
for (var i=0,len=this.length;i<len;++i) anon(this[i]);
};
myArray.each(function(item){ console.log(item); });
...这使得函数作为参数传递更加清晰,并且还有助于人们理解Ruby的语法。 :)
这是另一个匿名函数(回到Ruby):
def count_to(n)
puts "I'm going to count to #{n}"
count = lambda do |i|
if (i>0)
count[i-1]
puts i
end
end
count[n]
puts "I'm done counting!"
end
count_to(3)
#=> I'm going to count to 3
#=> 1
#=> 2
#=> 3
#=> I'm done counting!
尽管这个例子显然已经做好了,但它展示了如何创建一个新函数(在本例中命名为 count )并将其分配给变量,并将其用于master方法中的递归调用。 (有些人认为这比仅为递归创建第二种方法更好,或者使用主方法重新使用非常不同的参数进行递归。)
该函数没有名称,变量没有名称。您可以将它分配给任意数量的变量,所有变量都有不同的名称。
回到第一个例子,在Ruby中甚至有一种语法可以将lambda作为单个受祝福的块传递:
print_it = lambda{ |item| puts item }
%w[a b c].each(&print_it)
#=> a
#=> b
#=> c
...但您也可以将lambda作为普通参数传递并稍后调用,如下所示:
module Enumerable
def do_both_to_each( f1, f2 )
each do |item|
f1[item]
f2[item]
end
end
end
print_prefix = lambda{ |i| print "#{i}*#{i} -> " }
print_squared = lambda{ |i| puts i*i }
(1..4).do_both_to_each(print_prefix,print_squared)
#=> 1*1 -> 1
#=> 2*2 -> 4
#=> 3*3 -> 9
#=> 4*4 -> 16
答案 2 :(得分:6)
对于以前的答案,在使用closures时,匿名函数非常有用:
def make_adder n
lambda { |x|
x + n
}
end
t = make_adder 100
puts t.call 1
或(在Ruby 1.9中):
def make_adder_1_9 n
->(x) {
x + n
}
end
t_1_9 = make_adder_1_9 100
puts t_1_9.call 1
答案 3 :(得分:4)
正如维基百科所说:一个没有名字的功能。
这意味着您无法通过使用其名称和参数以典型方式调用该函数。相反,函数本身通常是另一个函数的参数。对函数进行操作的函数称为“高阶函数”。
考虑这个JavaScript(我知道你标记了这个红宝石,但......):
window.onload=function(){
//some code here
}
该函数将在页面加载时执行,但您无法通过名称调用它,因为它没有名称。
答案 4 :(得分:0)
当我订购我最喜欢的汉堡(油腻的Big Nac)时,我不想花5分钟填写一份正式的订购申请:姓名,地址,电话号码等。我没有时间这样做。我想用我的嘴:“给我一个汉堡”,又好又快又容易。
除了编码时,匿名方法有点像同一件事:
编码时相同。如果必须定义一个函数,则必须将其放置在其他地方,必须将其命名为某种东西,这很痛苦,尤其是如果您知道永远不会需要它的时候。而且,当您阅读代码时,可能必须使用复杂的IDE再次找到该方法及其引用。真痛苦!您需要一个可以直接在代码中编写,需要的地方,然后完成并移动它的一次性方法。匿名方法解决了这个特殊问题。
答案 5 :(得分:-2)
匿名函数具有以下特征: