在大多数具有控制流关键字的编程语言中,每个控制流关键字都有一个明确且明确的含义。然后就是Ruby,其中return
的含义是 contextual :it does two very different things depending on whether or not you're inside of some (but not all!) types of anonymous functions.我不熟悉任何其他语义相似的语言。
这是真的,如果我有一些编写得相当好的Ruby代码,并且我想把它翻译成另一种语言,(让我们说C#,因为它在这里非常受欢迎,)我将如何处理“特殊”返回为了保留原来的行为?
我能想到的最接近的事情是将“特殊”返回变为throw new RubyNestedReturnException(<return value here>)
并将所有调用放在捕获try/catch
的{{1}}块中并返回其中的值。这可能会奏效,但会非常混乱。有没有更好的方法呢? (并且不,“只是将使用带有”特殊“返回的proc的所有调用转换为RubyNestedReturnException
语句”不是一个好的答案,因为一些调用涉及从函数外部作为参数传入的proc它会调用它们。)
答案 0 :(得分:2)
C#没有直接的等价物。 try..catch
黑客可能在表面上有效,但您可以更好地将代码翻译成您选择的语言。
我的意思是,没有自尊的程序员会用Python编写简单的for i=1 to 10
(或等效的),无论其他语言是什么。它根本不是“Pythonic”的方式。 C#有更多传统的根(C ++),因此编写类似C#的代码应该相对简单。
如果您感兴趣,C(setjmp
/ longjmp
)和Java(break label;
)都有类似的东西,并且(通常)都被视为代码气味生成器。我建议完全避免它并使用更传统的控制流操作重写代码。