代码之家  ›  专栏  ›  技术社区  ›  weakish

与smalltalk相比,ruby中的块

  •  11
  • weakish  · 技术社区  · 14 年前

    ruby中的block是什么意思?它与Smalltalk类似,但您不能向它发送消息。

    例如,在Smalltalk中:

    [:x | x + 3] value: 3
    

    返回6。但在红宝石中:

    {|x| x + 3}.call 3
    

    将导致语法错误。

    不过,您可以在Ruby中将消息传递给lambda:

    irb(main):025:0> ->(x){x+3}.call 3
    => 6
    

    所以在Ruby中,块不是块,但lambda是块?这是真的吗?我是说,RubyLambda和Smalltalk块之间有什么区别吗?如果这是真的,那么什么是红宝石块?

    更新:

    从下面的评论和回答,加上一些谷歌搜索,我想我 对Ruby块有更多的了解。在Ruby中,通常一段代码计算一个值,而每个值都是一个对象。但是,block不计算值。所以它不是一个物体。相反,它可以作为 部分 物体的例如,in x x+3可以作为对象过程x x+3的一部分。

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

    3 回复  |  直到 9 年前
        1
  •  14
  •   Amadan    14 年前

    首先,Ruby块最重要的不是:一个对象。它是一个句法结构,显然也有一个等价的实现——但它不是一个对象,因此不能接收消息。这就是你的例子

    {|x| x + 3}.call 3
    

    不合语法的lambda、procs-这些对象包装一个块,并具有 call 执行块的方法。

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

    Proc.new {|x| x + 3}.call 3
    
        2
  •  1
  •   mathk    14 年前

    精度:

    我甚至会说,在smalltalk中,绑定是由对象组成的。 想想方法上下文。 实际上,您要做的是将对象存储在方法上下文中。 所以

    a := Object new
    

    可以重写为:

    thisContext at: 1 put: Object new.
    

    但显然你不会这样写的,因为你需要知道were是temps变量。

        3
  •  1
  •   Euan M    9 年前

    斯莫尔塔克的一个街区 是匿名对象。在语法上,它由 [ ] 一对。

    当被计算时,它将返回自己内部最后一个被计算的表达式,并且在它的协议中有很多方法。

    以下是smalltalk块的类注释(在本例中,是Dolphin smalltalk 6.03社区版)

    “块封装了以后要执行的语句序列。块可以捕获(或“关闭”)运行时状态,例如临时变量的值,这些值来自创建它们的点处的封闭词汇范围。当对块进行计算时,它就像在定义它的词汇范围中一样执行,但块可能具有在计算时绑定的参数。块可以作为带有消息的参数传递给其他对象,并在适当的时候由这些对象进行评估,从而形成一个非常强大和通用的“可插入性”机制,这是提供smalltalk大部分功能的核心功能。

    相比之下, 红宝石街区 只是一个参数字符串。它由一个 { } 配对,但它没有自己的方法。