Ruby 中的 block 是什么意思?它看起来与 Smalltalk 相似,但你不能向其发送消息。
例如,在 Smalltalk 中:
[:x | x + 3] value: 3
返回 6。但在 Ruby 中:
{|x| x + 3}.call 3
会导致SyntaxError。
不过在Ruby中,你可以向lambda传递消息:
irb(main):025:0> ->(x){x+3}.call 3
=> 6
在Ruby中,块不是块,但lambda是块?这是真的吗?我的意思是,Ruby lambda和Smalltalk block之间有什么区别吗?如果是这样,那么Ruby块是什么?更新:
根据下面的评论和答案以及一些搜索,我对Ruby块有了更多的理解。在Ruby中,通常一段代码会评估一个值,而每个值都是一个对象。但是,块不评估值,因此它不是一个对象。相反,它可以作为对象的一部分来使用。例如,在{|x| x + 3}中,它可以作为proc {|x| x + 3}对象的一部分。
但这让我感到困惑。在Smalltalk中,几乎每个表达式都可以分解为对象(绑定到变量的除外)。看起来在Ruby中有更多的例外情况。