什么是lambda与proc或Struct与Class区别的正确术语?



在Ruby中,我开始将struct视为"结构风格的类",将lambda视为"lambda风格的过程"。有没有一个更正确的术语来描述这些区别?

为了说明我的意思:

p = proc { |text| puts text }
p.inspect
                              #=> #<Proc:0x007fd9c135fd98@(irb):5>
# vs
l = lambda { puts 'foo' }
l.inspect                     #=> "#<Proc:0x007fbf33ad2830@(irb):7 (lambda)>"

…同样:

Point = Class.new
Point.class                #=> Class
p = Point.new
p.class                    #=> Point
p.inspect                  #=> #<Point:0x007fd9c1038ef8>
# vs
Point = Struct.new(:x, :y)
Point.class                #=> Class
p = Point.new
p.class                    #=> Point
p.inspect                  #=> "#<struct Point x=nil, y=nil>"

区分类与结构或lambda与进程的最佳方法是将它们视为具有不同刚性级别的相关数据结构。

在Ruby中,类和结构都是数据结构,用于将数据绑定到代码。该结构体以一种非常松散的方式完成此操作,使用相当于内部散列的方式来存储数据。通常,它们被认为比类更短暂,因为您可以在它们中放入更少的逻辑。该类允许您创建更具体的数据结构,以便在代码库中的多个位置使用。在Ruby中创建一个struct会创建一个新的类对象(它调用C中的rb_class_new)。

Ruby中进程和lambda的区别在主题上是相似的。lambda是一个更严格的过程(具有参数检查和不同的返回行为)。它也不展开数组参数或使用nil代替缺少的参数。

这些都相当于您希望在您选择的数据结构中为您提供多少结构。如果您只想对数据进行键/值访问,散列可以做类可以做的事情。Ruby中另一个重要的考虑是如何组织代码库。您通常可以在Ruby中做任何您想做的事情,因此您可以创建一个散列,您使用了基于原型的方法声明,该散列在您的代码中被重复克隆。这可能会让你的同事想要伤害你。一般来说,类是选择的数据结构或任何重要的数据和逻辑绑定。当参数很重要或者你想确保只从局部范围返回时,可以选择Lambdas。

"lamdaness"没有官方术语。

文档提到lambda具有"严格的参数处理",并且没有"技巧"!除了参数处理之外,一个重要的区别是return关键字的处理。请看这篇文章。

对于Struct,重要的是要认识到Struct.new不返回Struct的实例,而是从Struct继承了一个新的Class

最新更新