lambda vs proc或Struct vs Class区分的正确用语是什么?

时间:2013-03-04 13:26:52

标签: ruby

在Ruby中,我开始将Structs视为“struct-flavored classes”,将lambdas视为“lambda-flavored procs”。这些区别是否有更正确的术语?

说明我的意思:

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>"

2 个答案:

答案 0 :(得分:1)

“lamdaness”没有官方用语。

documentation谈到lambdas有“严格的参数处理”且没有“技巧”!除了参数处理之外,一个重要的区别是处理return关键字。例如,请参阅this post

至于Struct,重要的是要认识到Struct.new不会返回Struct的实例,而是返回从Class继承的新Struct

答案 1 :(得分:1)

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

在Ruby中,类和结构都是旨在将数据绑定到代码的数据结构。结构以非常松散的方式执行此操作,相当于内部哈希来存储数据。一般来说,它们被认为比类更短暂,因为你会把更少的逻辑放在其中。该类允许您创建一个更具体的数据结构,您打算在代码库中的多个位置使用该数据结构。在Ruby中创建一个struct会创建一个新的类对象(它在C中调用rb_class_new

Ruby中procs和lambdas的区别在于主题相似。 lambda是一个更严格的proc(带有参数检查和不同的返回行为)。它也不会扩展数组参数或使用nil代替缺少的参数。

这一切都取决于您希望在您选择的数据结构中为您提供多少结构。如果您只想要对数据进行键/值访问,则哈希可以执行类所能做的事情。 Ruby中另一个重要的考虑因素是您希望如何组织代码库。您通常可以在Ruby中执行任何操作,因此您可以使用基于原型的方法声明创建哈希,并通过代码重复克隆。这可能会让你的同事想要伤害你。通常,类是选择的数据结构或任何重要的数据和逻辑绑定。当参数很重要或者如果你想确保只从本地范围返回时,将选择Lambdas。