Function 什么是非本地报税表?

Function 什么是非本地报税表?,function,programming-languages,Function,Programming Languages,什么是非本地回报?在什么情况下它是有用的?请给出一个例子来解释。它意味着退出一个函数,并在调用该函数的地方之外的其他地方结束。在Java和C++中,它主要用于表示异常(即try、throw、和catch),但它也可以表示类似于C中的setjmp/longjmp等机制,用于在ruby块上下文中使用非局部返回 Ruby的块支持非本地返回(一些引用),这意味着 从块返回的行为与从 块的原始上下文 这基本上意味着您可以从函数调用一个块,并且该块可以从原始函数返回。为了解释这个问题,这里有一些示例代码来解

什么是非本地回报?在什么情况下它是有用的?请给出一个例子来解释。

它意味着退出一个函数,并在调用该函数的地方之外的其他地方结束。在Java和C++中,它主要用于表示异常(即
try
throw
、和
catch
),但它也可以表示类似于C中的
setjmp/longjmp
等机制,用于在ruby块上下文中使用非局部返回

Ruby的块支持非本地返回(一些引用),这意味着 从块返回的行为与从 块的原始上下文


这基本上意味着您可以从函数调用一个块,并且该块可以从原始函数返回。

为了解释这个问题,这里有一些示例代码来解释非局部返回是什么

object Scratch {
    def foo: Int = {
        val list = List(1, 2, 3, 4)
        list.foreach { each =>
            if(each > 2) {
                return each // NLR
            }
            println(each)
    }
    return 5   
}


def main(args : Array[String]) : Unit = {
    val i = foo
    println("i: " + i)   
}
上面的代码是用Scala编写的,但对于支持非本地返回的任何其他语言,如Kotlin和最突出的Smalltalk和Ruby(我认为大多数函数式编程语言,如List),情况都是一样的

这里的要点是,上面的代码会将此输出写入控制台:

1
2
i: 3
因此它也不会将4和5打印到控制台,这就是本例中与不支持闭包内非本地返回的语言的最大区别


在上面的代码片段中,第“NLR”行的返回返回了闭包>>并注意到scala3中不推荐使用此功能(请参见)@Amit Portnoy:这是正确的,它确实让我感到悲伤:-(.我在Scala语言论坛上发了一篇帖子,试图与Scala的人谈论这件事,但没有得到回答。它还没有完全消失,你需要用
返回
并使用
throwReturn
()。他们试图使基本的ExpException用法更加明确。还请注意,您将有一些延续,使这种行为更加结构化。()