3

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

2 回答 2

1

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

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

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

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

于 2013-03-04T19:33:15.080 回答
1

“lamdaness”没有正式的术语。

文档讨论了 lambdas 具有“严格的参数处理”并且没有“技巧”!除了参数处理之外,一个重要的区别是return关键字的处理。例如看这篇文章

至于Struct,重要的是要意识到它Struct.new不会返回一个实例,Struct而是一个Class继承自的新实例Struct

于 2013-03-04T16:09:14.773 回答