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

Ruby有返回值的特殊存储吗?

  •  2
  • prosseek  · 技术社区  · 14 年前

    下面的Ruby代码

    def a(b,c) b+c end 
    

    与python相同

    def a(b,c): return b+c
    

    看起来Ruby有一个特殊的存储(堆栈或其他东西),它存储最终的评估结果,并在调用函数时返回值。

    • 如果是这样的话,堆栈的名称是什么,如何获取该堆栈?
    • 如果不是,Ruby代码如何在不返回某些内容的情况下工作?
    4 回复  |  直到 12 年前
        1
  •  5
  •   Jack    14 年前

    这不是魔法, 红宝石 只返回在结束时执行的操作返回的值。

    它是在解析级别实现的SyncStrategicSugar:一个计算某些内容的语句隐式返回自身,不带任何关键字。

    稍微澄清一下,你可以想象两者 抽象语法树 在这两个片段中:它们不会有所不同。

        2
  •  2
  •   Matchu    14 年前

    我觉得这不是一堆。函数的最终评估只是返回值,简单明了。只是你日常的红宝石句法糖。

        3
  •  1
  •   Carl Smotricz    14 年前

    我不明白为什么 堆栈 应要求返回结果。一个指向内存位置的简单指针就足够了。我想这通常会在登记簿上退回,比如 EAX .

    通过将函数的值赋给变量(或用它做其他事情),可以得到函数的返回值。这就是它的用途,也是唯一有效的方法。

    不是 返回任何东西都非常简单:被调用的函数不会将任何东西放入返回位置(不管它是什么),调用方会忽略它。

        4
  •  1
  •   Skade    14 年前

    实际上,返回在这里是特殊的,而不是标准的行为。考虑:

    def foo(ary)
      ary.each do |e|
        return true if e == 2
      end
    end
    

    这段代码实际上有不止一个堆栈帧(至少是on for foo、one for array each和one for anonymous function passed to each)。返回的作用:它跳转到调用它的最外层词法范围(foo的结尾)的堆栈帧,并返回给定的值。如果您经常使用匿名函数,您会发现在所有上下文中都不允许返回,而只返回最后一个计算值是。

    因此,如果您不需要返回,我建议您永远不要使用它,因为正是因为这个原因:中断并从正在运行的迭代返回。