什么是匿名函数?

时间:2011-04-24 02:40:24

标签: ruby anonymous-function

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

或者换句话说,我(如果我理解的话)将如何向我母亲解释匿名函数?

6 个答案:

答案 0 :(得分:14)

匿名函数具有以下特征:

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

答案 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)

匿名函数具有以下特征:

  • 没有名字
  • 内联声明
  • 声明后直接执行