Ruby 当我们有方法时,Procs和Lambdas用于什么
我的怀疑几乎是一种误解 从我读到的内容来看,Ruby 当我们有方法时,Procs和Lambdas用于什么,ruby,Ruby,我的怀疑几乎是一种误解 从我读到的内容来看,块是由{}或do和end包围的一组代码 根据我的理解,Proc或Lambda所做的是: 获取此块 将块分配给变量 也就是说;我们不需要一直重复整个块 但是,Proc、Lambda和标准的方法之间有什么区别呢?根据我的理解,它们的工作方式都是一样的。ruby中的所有东西都被视为对象Proc和lambda是基本相似的结构。就用法而言,这个话题是非常固执己见的 关键的优点是它们可以很容易地传递到其他块,并且语法简短而甜美。考虑下面的非常简单的例子: mult
块
是由{}
或do
和end
包围的一组代码
根据我的理解,Proc
或Lambda
所做的是:
块
块
分配给变量
块
但是,Proc
、Lambda
和标准的方法之间有什么区别呢?根据我的理解,它们的工作方式都是一样的。ruby中的所有东西都被视为对象Proc
和lambda
是基本相似的结构。就用法而言,这个话题是非常固执己见的
关键的优点是它们可以很容易地传递到其他块
,并且语法简短而甜美。考虑下面的非常简单的例子:
multiply = Proc.new {|x,y| x*y}
subtract = lambda {|x,y| x-y}
add = ->(x,y) {x+y}
def do_math (opr, *b)
opr.each do |bloc|
puts bloc.call(b[0],b[1])
end
end
do_math([multiply, subtract, add], 10, 5)
# => 50
# => 5
# => 15
puts multiply.call(5,5)
# => 25
puts subtract.call(5,5)
# => 0
puts add.call(5,5)
# => 10
要更好地了解它们是什么,请观看以下视频:
此外,文档中还有更多示例:我发现这有助于区分。在Proc
s(和lambdas)和方法之间有一个关键的区别<代码>过程
是对象,方法不是。由于Ruby是一种面向对象的语言,您只能对对象进行操作,这一点非常重要
因此,如果您想将一段代码传递给一个方法,您需要一个对象,这就是Proc
s提供的
您可以通过object#method
方法获得表示方法的代理对象,该方法将返回method
类的实例(duck键入Proc
)。阅读本文-谢谢@Cary,但事实上我确实了解Procs和Lambdas。我要问的只是为什么要使用它们而不是使用方法。它不是做了完全相同的事情吗?如果我正确理解了你的问题,那么最好把它框成这样:“我理解过程、lambda和方法之间的区别,但考虑到它们都做几乎相同的事情,我不明白什么时候应该使用一个而不是使用另外两个。有没有指导方针可以帮助我理解这一点?“天哪,我觉得那支细箭很难看。谁能解释一下我没有看到的背后的逻辑和美吗?@kal,美是旁观者的眼睛。你有权这么想。我个人喜欢并欣赏这种简洁。我知道它是干什么的,它只有两个字<代码>->
我也更喜欢我更喜欢@Kal我知道你在说什么。但这都是关于透视的。可以把它看作是用参数刺伤块
,因此刺伤lambda
:)我记得几年前读过(也许是在《为什么(辛辣的)Ruby指南?》时,我认为竖条是一个滑槽,通过它,论点滑下并进入到块中。不知怎的,这对我来说还是比刺伤羔羊更好!但我离题了,这是我认为在这些评论中不应该做的事。:-)如果你真的发布一个答案,这将是很有帮助的。链接到其他人的答案而不至少在自己的答案中进行总结是不可取的。