Ruby中的Block与Smalltalk相比

wea*_*ish 11 ruby smalltalk

Ruby中的块是什么意思?它与Smalltalk看起来类似,但您无法向其发送消息.

例如,在smalltalk中:

[:x | x + 3] value: 3
Run Code Online (Sandbox Code Playgroud)

返回6.但是在红宝石中:

{|x| x + 3}.call 3
Run Code Online (Sandbox Code Playgroud)

将导致SyntaxError.

好吧,你可以在ruby中将消息传递给lambda:

irb(main):025:0> ->(x){x+3}.call 3
=> 6
Run Code Online (Sandbox Code Playgroud)

所以在Ruby中,块不是一个块,但lambda是一个块?这是真的?我的意思是,红宝石lambda和smalltalk块之间有什么区别吗?如果这是真的,那么什么是红宝石块呢?

更新:

从下面的评论和答案,以及一些谷歌搜索,我想我对Ruby块有了更多的了解.在Ruby中,通常一段代码会计算一个值,而每个值都是一个对象.但是,块不会评估值.所以这不是一个对象.相反,它可以作为对象的一部分.例如,在{| x |中 x + 3}可以作为对象proc {| x |的一部分 x + 3}.

但它确实让我困惑.在smalltalk中,几乎每个表达式都可以分为对象(绑定到变量是例外).在Ruby中似乎有更多例外.

Ama*_*dan 14

首先,Ruby块不是最重要的东西:一个对象.它是一个语法结构,显然也有一个等效的实现 - 但它不是一个对象,因此不能接收消息.这就是你的榜样

{|x| x + 3}.call 3
Run Code Online (Sandbox Code Playgroud)

不合语法.Lambdas,procs - 那些是包装块的对象,并且有一个call执行块的方法.

因此,块只是一段代码,可以传递给参数列表之外的方法 - 不多也不少.例如,如果将它传递给Proc.new构造函数,它将包装它并为您提供一个可以处理的对象:

Proc.new {|x| x + 3}.call 3
Run Code Online (Sandbox Code Playgroud)