什么是匿名函数?

Cas*_*how 14 ruby anonymous-function

在我的千行Ruby之旅中,我对匿名函数的概念非常困难.维基百科说了一些关于代码中有一些无名灵魂的东西,它提交到更高的顺序,但我的理解在那里结束.

或者换句话说,我(当我理解的时候)如何解释我妈妈的匿名功能?

sym*_*tri 14

匿名函数具有以下特征:

  1. 它没有名字(因此是匿名的)
  2. 是内联定义的
  3. 当您不想要正常功能的开销/形式时使用
  4. 除非作为参数传递给另一个函数,否则不会多次显式引用

  • 4是错的.它们只有在不止一次被引用时才开始有意义,就像块可以是小块的. (3认同)

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)


dem*_*mas 6

对于以前的答案,在使用闭包时,匿名函数非常有用:

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)

  • 在你的1.9例子中,你也可以使用`call`的语法糖:`t_1_9.(1)`. (3认同)
  • ......在1.8和1.9中,lambdas也可以通过`t_1_9 [1]`_来调用(它比`.call`或`.()更短,而且在我看来,更美观的是_). (2认同)