Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何翻译Ruby';什么是奇怪的返回语义?_C#_Ruby - Fatal编程技术网

C# 如何翻译Ruby';什么是奇怪的返回语义?

C# 如何翻译Ruby';什么是奇怪的返回语义?,c#,ruby,C#,Ruby,在大多数具有控制流关键字的编程语言中,每个控制流关键字都有一个明确的含义。还有Ruby,其中return的含义是上下文的:我不熟悉任何其他具有类似语义的语言 这是真的,如果我有一些写得相当好的Ruby代码,并且我想将其翻译成另一种语言(比如说C#,因为它在这里非常流行),我将如何处理“特殊”返回以保留原始行为 我能想到的最接近的事情是将一个“特殊”返回转换为一个抛出新的rubyNedReturnException(),并将所有调用放在一个try/catch块中,该块捕获rubyNedReturn

在大多数具有控制流关键字的编程语言中,每个控制流关键字都有一个明确的含义。还有Ruby,其中
return
的含义是上下文的:我不熟悉任何其他具有类似语义的语言

这是真的,如果我有一些写得相当好的Ruby代码,并且我想将其翻译成另一种语言(比如说C#,因为它在这里非常流行),我将如何处理“特殊”返回以保留原始行为

我能想到的最接近的事情是将一个“特殊”返回转换为一个抛出新的rubyNedReturnException(),并将所有调用放在一个
try/catch
块中,该块捕获
rubyNedReturnException
并返回其中的值。这可能会奏效,但会非常混乱。有没有更好的办法?(不,“只要将使用带有“特殊”返回的proc的所有调用转换为
返回
语句”并不是一个好答案,因为有些调用涉及从调用它们的函数外部作为参数传入的proc。)

C#没有直接的等价物。
try..catch
hack可能在表面上有效,但将代码翻译成您选择的语言会更好

我的意思是,没有一个自尊心强的程序员会用Python为I=1到10(或同等语言)编写一个简单的
,不管其他语言怎么说。这根本不是“蟒蛇式”的方式。C#有更传统的根(C++),因此编写类似C的代码应该相对简单


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

请记住,从一种语言到另一种语言的翻译通常不是直接的逐行转换。在一种语言中有意义的结构在另一种语言中没有保证,甚至没有要求有意义。用C#编写Ruby-ish代码并不比用Ruby编写C#ish代码好多少。这对于一个经验丰富的C#开发者来说可能是明智的,对于一个Ruby新手来说也可能是非常愚蠢的。从我从链接的问题中可以推断出,这似乎不是
返回本身。我不知道什么是
Proc
,但它看起来更像是一个C#
{}
块,而不是一个lambda,除非你不能在C#中引用块。C#lambdas的行为就像Ruby的lambdas wrt
return
@Lucastrezesniewski:它本质上是一个
{}
块和lambda的突变杂交体p对于这张唱片,我喜欢
break label
,如果是C#,我会用它。但是,是的,大多数人对此犹豫不决。