2013-03-04 73 views
3

在Ruby中,我已经开始将Structs视为“结构化风格的类”,将lambdas视为“lambda风格的过程”。这些区别有没有更正确的术语?lambda vs proc或Struct vs Class的区别是什么?

为了说明我的意思:

p = proc { |text| puts text } 
p.inspect 
           #=> #<Proc:[email protected](irb):5> 
# vs 

l = lambda { puts 'foo' } 
l.inspect      #=> "#<Proc:[email protected](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>" 

回答

1

没有为 “lamdaness” 无为官一任。

关于有“刚性参数处理”,并没有“招数” lambda表达式的documentation洽谈!除了参数处理之外,一个重要的区别是处理return关键字。例如,请参阅this post

至于Struct,它认识到Struct.new不返回Struct而是一个新的ClassStruct继承实例简直是非常重要的。

+0

我建议“lambdacity”。 :) – 2013-03-04 20:28:05

1

区分类与结构或lambda表达式与特效的最好方法是将它们视为具有不同刚度级别的相关数据结构。

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

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

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

相关问题