sym*_*tri 14
匿名函数具有以下特征:
Phr*_*ogz 12
这是Ruby中匿名函数的一个示例(在本例中称为块):
my_array.each{ |item| puts item }
Run Code Online (Sandbox Code Playgroud)
上面的匿名函数在哪里?为什么,它是接收单个参数的那个,将其命名为"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); });
Run Code Online (Sandbox Code Playgroud)
...这使得函数作为参数传递更加清晰,并且还有助于理解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!
Run Code Online (Sandbox Code Playgroud)
虽然这个例子显然已经做好了,但它展示了如何创建一个新函数(在本例中为named count)并将其分配给一个变量,并将其用于master方法中的递归调用.(有些人认为这比仅为递归创建第二种方法更好,或者使用非常不同的参数重新使用主方法进行递归.)
该函数没有名称,变量也没有.您可以将它分配给任意数量的变量,所有变量都具有不同的名称.
回到第一个例子,在Ruby中甚至有一种语法用于传递lambda作为单个受祝福的块:
print_it = lambda{ |item| puts item }
%w[a b c].each(&print_it)
#=> a
#=> b
#=> c
Run Code Online (Sandbox Code Playgroud)
...但您也可以将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
Run Code Online (Sandbox Code Playgroud)
对于以前的答案,在使用闭包时,匿名函数非常有用:
def make_adder n
lambda { |x|
x + n
}
end
t = make_adder 100
puts t.call 1
Run Code Online (Sandbox Code Playgroud)
或者(在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
Run Code Online (Sandbox Code Playgroud)