Ruby 什么是匿名函数?
在我的一千行Ruby之旅中,我对匿名函数的概念感到非常困难。维基百科代码中有一些无名的灵魂,它向更高的层次屈服,但我的理解到此为止Ruby 什么是匿名函数?,ruby,anonymous-function,Ruby,Anonymous Function,在我的一千行Ruby之旅中,我对匿名函数的概念感到非常困难。维基百科代码中有一些无名的灵魂,它向更高的层次屈服,但我的理解到此为止 或者换句话说,当我理解它时,我该如何向我妈妈解释匿名函数?正如维基百科所说:一个没有名字的函数 这意味着您无法使用函数名和参数以典型方式调用函数。相反,函数本身通常是另一个函数的参数。对函数进行操作的函数称为“高阶函数” 考虑一下这个JavaScript(我知道你标记了这个ruby,但是…): 该函数将在页面加载时执行,但您不能按名称调用它,因为它没有名称。匿名函数
或者换句话说,当我理解它时,我该如何向我妈妈解释匿名函数?正如维基百科所说:一个没有名字的函数 这意味着您无法使用函数名和参数以典型方式调用函数。相反,函数本身通常是另一个函数的参数。对函数进行操作的函数称为“高阶函数” 考虑一下这个JavaScript(我知道你标记了这个ruby,但是…):
该函数将在页面加载时执行,但您不能按名称调用它,因为它没有名称。匿名函数具有以下特征:
下面是Ruby中匿名函数的一个示例(本例中称为块): 上面的匿名函数在哪里?它接收单个参数,将其命名为“item”,然后打印出来。在JavaScript中,上述内容可以写成
Array.prototype.each=函数(anon){
对于(var i=0,len=this.length;i在沉迷于以前的答案中,匿名函数在处理以下问题时非常有用:
或者(在Ruby 1.9中):
匿名方法的意义是什么?
类比解释:
当我点我最喜欢的汉堡(一种油腻的大Nac)时,我不想花5分钟填写正式的订单申请:姓名、地址、电话号码等。我没有时间。我想用我的嘴:“给我一个汉堡”,又好又快又简单
匿名方法与此类似,但编码时除外:
这有点像一次性方法,可以让你更快地编写代码
编码时也是如此。如果你必须定义一个函数,你必须把它放在别的地方,你必须称它为某种东西,这是一种痛苦,特别是如果你知道你永远不再需要它。当你阅读代码时,你可能不得不使用一个复杂的IDE来再次找到该方法,以及对它的引用。真是痛苦!你需要一个一次性方法,你可以直接在你的代码中编写,在你需要它的地方,然后完成它,并移动一个。匿名方法可解决此特定问题。匿名函数具有以下特征:
- 没有名字
- 内联声明
- 声明时直接执行
+1此外,由于您询问的是ruby,匿名ruby函数被称为lambdas。“匿名函数”是Perl社区和javascript社区中更常用的术语吗?您可以在lisp/scheme中称之为lambda表达式。在1.9示例中,您也可以使用call
的语法sugar:t\u 1\u 9。(1)
…在1.8和1.9中,lambda也可以通过t\u 9[1]
调用(它比.call
或()
都短,在我看来,更美观)。你能解释一下你所说的“不被多次明确引用”的意思吗?我觉得它不正确。例如:x=lambda{…};def bar(y);@opts={callback:y};end;bar(x)
现在该函数有两个引用,如果bar
创建任何闭包,则很容易有三个引用。为什么您建议这些引用以某种方式使这个lambda不再是“匿名函数”?您能解释一下“是内联定义的”是什么意思吗?如果某个东西不是“内联定义的”(但与您的其他标准相匹配),它将不再是“匿名函数”,那么该例子是什么?内联是指将匿名函数用作参数或在另一个函数体中定义等。非内联将是一个典型的函数。4是错误的。它们只有在多次引用时才有意义,就像smalltalk中的块一样。我不熟悉smalltalk,但如果我t没有名字?在公认的答案中,几乎所有这些观点都已经被详细提到。
window.onload=function(){
//some code here
}
my_array.each{ |item| puts item }
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!
print_it = lambda{ |item| puts item }
%w[a b c].each(&print_it)
#=> a
#=> b
#=> c
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
def make_adder n
lambda { |x|
x + n
}
end
t = make_adder 100
puts t.call 1
def make_adder_1_9 n
->(x) {
x + n
}
end
t_1_9 = make_adder_1_9 100
puts t_1_9.call 1