为什么我们称lambdas为匿名函数?

时间:2017-09-25 03:09:29

标签: ruby lambda

我命名为lambda lamb

lamb = lambda { |name| "hello #{name}"}
lamb.call("Steve") # => "hello Steve"

因为我给这个函数起了一个名字,所以它不再是匿名的。为什么我们称之为匿名?

3 个答案:

答案 0 :(得分:2)

正如已经指出的那样,是否将lambda分配给变量并不能真正改变lambda本身未命名的事实。看一下方法对象的行为与la​​mbda之间的区别:

def test; end
mt = method(:test)
#=> #<Method: Object#test>
mt.arity
#=> 0
mt.name
#=> :test
l = -> {}
l.arity
#=> 0
l.name
NoMethodError: undefined method `name' for #<Proc:0x007faef08319f8@(irb):13 (lambda)>

正如您所看到的,对于方法,名称是方法对象的固有部分,对于lambda,它不是。 lambda表达式返回的是一个匿名函数,然后将其赋值给变量。这与分配sum = 1 + 2没有什么不同,其中右侧的表达式与其分配的名称没有固有的连接。这也可以通过以下事实来说明:完全可以在不首先给它命名的情况下调用lambda:

x = 1
->{x+1}.()
#=> 2

答案 1 :(得分:1)

Lambda / procs只是匿名如果它们未命名,例如:

# anonymous lambda
[1,2,3].map(&lambda {|x| x * x})

# named lambda
square = lambda {|x| x * x} 
[1,2,3].map(&square)

答案 2 :(得分:1)

示例中的lambda是匿名的。 “lamb”不是lambda的名称,它是一个局部变量的名称,其值是一个匿名的lambda方法。

变量不会将lambda命名为x = 42,而是命名数字。

将其与类中的方法进行对比。它们被命名为将它们添加到类或模块中的一部分。