gpt4 book ai didi

ruby - 何时何地使用 Lambda?

转载 作者:数据小太阳 更新时间:2023-10-29 06:26:56 26 4
gpt4 key购买 nike

我试图理解为什么我们真的需要 ruby​​(或与此相关的任何其他语言)中的 lambda 或 proc?

#method
def add a,b
c = a+b
end

#using proc
def add_proc a,b
f = Proc.new {|x,y| x + y }
f.call a,b
end

#using lambda function
def add_lambda a,b
f = lambda {|x,y| x + y}
f.call a,b
end

puts add 1,1
puts add_proc 1,2
puts add_lambda 1,3

我可以使用以下方法进行简单的加法运算:1. 普通函数 def,2. 使用 proc 和 3. 使用 lambda。

但为什么以及在现实世界中哪里使用 lambda?任何不能使用函数而应该使用 lambda 的示例。

最佳答案

的确,您不需要匿名函数(或 lambda,或任何您想调用它们的东西)。但是有很多东西您不需要。您不需要类——只需将所有实例变量传递给普通函数即可。然后

class Foo
attr_accessor :bar, :baz
def frob(x)
bar = baz*x
end
end

会变成

def new_Foo(bar,baz)
[bar,baz]
end

def bar(foo)
foo[0]
end
# Other attribute accessors stripped for brevity's sake

def frob(foo,x)
foo[0] = foo[1]*x
end

同样,除了 loop...end 之外,您不需要任何循环与 ifbreak .我可以继续说下去。1 但是您想要使用 Ruby 中的类进行编程。您希望能够使用 while循环,甚至可能是 array.each { |x| ... } ,并且您希望能够使用 unless而不是 if not .

就像这些功能一样,匿名函数可以帮助您优雅、简洁、明智地表达事物。会写some_function(lambda { |x,y| x + f(y) })比必须写要好得多

def temp(x,y)
x + f(y)
end
some_function temp

必须中断代码流才能写出 def 的体积要大得多fed 函数,然后必须给它一个无用的名字,当它很清楚地编写内联操作时。的确,没有什么地方是您必须使用 lambda 的,但是有很多地方我宁愿使用 lambda。

Ruby 使用 block 解决了很多使用 lambda 的情况:所有函数都像 each , map , 和 open可以将 block 作为参数的基本上是采用特殊情况的匿名函数。 array.map { |x| f(x) + g(x) }array.map(&lambda { |x| f(x) + g(x) })相同(其中 & 只是使 lambda 以与裸 block 相同的方式“特殊”)。同样,您可以写出一个单独的 def fed 每次都起作用——但你为什么想要呢?

除 Ruby 之外,支持这种编程风格的语言没有 block ,但通常支持更轻量级的 lambda 语法,例如 Haskell 的 \x -> f x + g x ,或 C# 的 x => f(x) + g(x); 2。任何时候我有一个函数需要采取一些抽象行为,比如 map , 或 each , 或 on_clicked ,我将感谢能够传入 lambda 而不是命名函数,因为它更容易。最终,您不再认为它们有些特别——它们与数组的文字语法一样令人兴奋,而不是 empty().append(1).append(2).append(3)。 .这只是该语言的另一个有用部分。


1:在退化的情况下,你真的只需要 eight instructions : +-<>[]., . <>沿着数组移动一个假想的“指针”; +-递增和递减当前单元格中的整数; []执行非零循环;和 .,做输入输出。事实上,你真的只需要 one instruction ,例如 subleq a b c (从 a 中减去 b,如果结果小于或等于零,则跳转到 c

2:我从未实际使用过 C#,因此如果该语法有误,请随时进行更正。

关于ruby - 何时何地使用 Lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4352191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com