2011-04-02 53 views

回答

8
>> al = lambda { |a,b,c| b } 
>> bl = lambda { |(a,b,c)| b } 
>> list = [[1,1,1], [2,2,2], [3,3,3], [4,0,4]] 
>> list.sort_by &al 
ArgumentError: wrong number of arguments (1 for 3) 
    from (irb):1:in `block in irb_binding' 
    from (irb):4:in `each' 
    from (irb):4:in `sort_by' 
>> list.sort_by &bl 
=> [[4, 0, 4], [1, 1, 1], [2, 2, 2], [3, 3, 3]] 

一种说明他们为什么这样做。

在Ruby中的变化的原因是,他们正在试图与常规方法lambda表达式是一致的:

>> def test(a,b,c); b; end 
>> test [1,2,3] 
ArgumentError: wrong number of arguments (1 for 3) 
    from (irb):16:in `test' 

一个好办法来解决的不完全漂亮的语法使用新的和有光泽刺运营商tm

cl = ->(a, b, c) { b }