如何翻译ruby奇怪的返回语义

本文关键字:返回 语义 ruby 何翻译 翻译 | 更新日期: 2023-09-27 18:07:18

在大多数具有控制流关键字的编程语言中,每个控制流关键字都有一个明确而明确的含义。然后是Ruby,其中return的含义是上下文:它做两件非常不同的事情,这取决于您是否在某些(但不是全部!)匿名函数类型中。我不熟悉任何其他具有类似语义的语言。

这是真的,如果我有一些写得相当好的Ruby代码,我想把它翻译成另一种语言(假设是c#,因为它在这里很流行),我该如何处理"特殊"返回以保持原始行为?

我能想到的最接近的事情是将"特殊"返回转换为throw new RubyNestedReturnException(<return value here>),并将所有调用放在捕获RubyNestedReturnException并返回内部值的try/catch块中。这可能会起作用,但会非常混乱。有更好的方法吗?(不,"只是将使用带有"特殊"返回的过程的所有调用转换为return语句"不是一个好的答案,因为一些调用涉及到从调用它们的函数外部作为参数传递进来的过程。)

如何翻译ruby奇怪的返回语义

c#没有直接的等价。try..catch hack表面上可以工作,但将代码翻译成您选择的语言会更好。

我的意思是没有一个有自尊的程序员会用Python写一个普通的for i=1 to 10(或类似的),不管其他语言怎么说。这根本不是"Pythonic"的方式。c#有更传统的根(c++),所以编写类似c#的代码应该相对简单。

如果您感兴趣,C (setjmp/longjmp)和Java (break label;)都有类似的东西,并且(通常)都被视为代码气味生成器。我建议完全避免它,并使用更传统的控制流操作重写代码。