分类
118金宝搏

新版《新倚天屠龙记》的评价褒贬不一但有三个地方做得很出彩

导读:新版《新倚天屠龙记》的评价褒贬不一,但有三个地方做得很出彩

在中国的影视圈里面,几乎每年都会有一部经典的作品被翻拍出来,而每一次翻拍,大多数时候都能够在网上引起很大轰动,这主要归功于这些经典已经有很高的群众基础。

让我们使用上面描述的例子来看看这个实际情况; 我们将在列表中搜索大于或等于7的第一个数字的索引。

或许是编剧害怕一成不变没有什么新意,在网上引不出什么话题,所以才会将后期的剧情改动幅度变大,但是在一些著名场景场面的改变,却反而弄巧成拙了。

当然,你可以使用自定义类型来创建非常相似的东西,但如果你想使用多个数字生成器,你可能需要最终声明一个接口并接受它作为使用生成器的其他函数的参数,就像这样。

我们要讨论的第一个用例是隔离数据。 我们在本系列的上一篇文章中对此进行了简要介绍,因此我们不会在此示例上花费太多时间。

使用闭包,你只需要将函数作为参数传入,因为你实际上只关心Generator接口中的一个方法。

请注意,我们的timed()函数接受一个可以用作处理函数的函数,并返回相同类型的函数,但返回的函数与传递它的函数不同。返回的闭包记录当前时间,调用原始函数,最后记录结束时间并打印出请求的持续时间。同时对我们的处理函数内部实际发生的事情不可知。

一些承诺库已经帮助解决了许多这些问题,而语言本身的变化也有所帮助。虽然这有助于前进,但它不太可能完全解决问题(至少立即),因为遗留的JavaScript代码将始终存在,开发人员仍然需要维护它。这就是为什么我个人欣赏这一点从一开始就融入了Go – 我们的地鼠不必担心新旧代码看起来令人难以置信并且感觉非常不同。

在这个例子中,我们的闭包是作为sort.Search()的第二个参数传递的简单小函数。

这种方法的好处是doWork()可以编码为异步函数 – 我们可以在调用doWork()之后继续使用我们的代码,并在doWork()运行完毕之前将“hi!”打印到屏幕上。 当doWork()完成运行时,它已经知道接下来要运行的代码。

3.访问通常不可用的数据

新版《新倚天屠龙记》在刚开始宣传的时候,最大的看点就是说尊重原著,能够很大地保留原著里面的情节,事实上前36集看下来,似乎还真是那个样子的,但是自从张无忌等人带着谢逊从灵蛇岛回来之后,剧情似乎就已经遭到“魔改”了,虽然在主线以及大转折点上面,还是保留原著的走向,但是小细节上面,已经被改得面目全非了。

如果你曾经使用过javascript,你可能会碰到一些看起来像这样的代码:

虽然这个例子并不难以理解,但是有几个嵌套函数可能会导致通常所说的回调地狱。 以下是此示例。

4.使用排序包进行二进制搜索

新版《倚天屠龙记》里面,将原来演过周芷若的周海媚请了回来,上了年纪之后的周海媚出演灭绝师太,表演得很出彩,完全将师太那种狠劲表现得淋漓尽致。

而众多翻拍作品里面,金庸先生的武侠小说可以说是显眼的。而金庸武侠小说里面,《倚天屠龙记》无疑是最大的IP之一,前前后后就已经被翻拍过好几遍了。

在本系列的最后一篇文章中 – Go和闭包中的常见错误 – 我介绍了一些可以通过闭包进行的常见错误,当你遇到这些错误时会看到的错误,以及如何预防/修复错误。其中大多数都是不明显的,所以值得一看,只是为了确保你不会意外地编写其中一个错误。

虽然这段代码不需要闭包,但如果我们想用更多逻辑包装我们的处理程序,那么闭包非常有用。 一个完美的例子就是我们想要在处理程序执行之前或之后创建中间件来完成工作。

在这种情况下,函数hello()被传递给http.HandleFunc()函数,并在匹配该路由时被调用。

这个闭包访问数字切片,即使它从未传入,并且对于任何大于或等于7的数字都返回true。通过这样做,它允许sort.Search()工作而不需要知道什么 你正在使用的基础数据类型,或你尝试满足的标准。 它只需要知道特定索引的值是否符合你的标准。

在javascript中,开发人员需要编写他们想要提供两种变体的每种方法的异步和同步版本,这可能是乏味和混乱的。

如果你正在寻找其他示例,可以查看我写的另一篇文章 – 如何使用Go进行测试。在本文中,我们为一个测试函数创建了多个测试用例,在代码中我们使用闭包来设置所谓的表驱动测试。这绝对是闭包的另一个非常常见的用例。

虽然这使用了我们在本文前面看到的技术,但值得指出它本身,因为它非常有用。

比如大幅度任用新人,这是一个好事情,毕竟娱乐圈里面重要有新的血液涌入,这样才能推陈出新,同时也给了那些逐梦青年一个机会。除此之外,剧中的以下三个地方,做得还是比较出彩的。

最后就是在配角上面,起到了画龙点睛的作用,之前的任何一个版本,我们都不会太过于注意杨逍这个角色,但是新版的《倚天屠龙记》不一样,将杨逍的各种风流倜傥,肆意潇洒的形象完全地表现了出来,甚至有改过男主张无忌的风头,完全配得上“逍”这个字;

但是新版的《倚天屠龙记》里面,或许是编剧太过偏爱周芷若了,大幅度提高了她的武功,再到后面与三神僧拼掌力的时候,周芷若竟然能够占据上风,这是不可思议的,毕竟内力不像外在招式,讲究的是厚积薄发。

在标准库中使用包时也经常需要关闭,例如排序包。

再者就是新版的《倚天屠龙记》里面任用了一些具有特殊意义的演员,比如周芷若的师父灭绝师太,这是一个在前期有着很重戏份的角色,所以这部剧能否成功,很大一部分原因也要看灭绝师太的表现。

首先就是在打斗上面,可以用硬核来形容。现在高科技很发达,大部分的打斗和场景其实都能够用电脑合成,而依靠目前成熟的技术,完全可以做到欧美科幻大片那种流畅度和逼真度。

比如最近的剧情里面,张无忌跟周芷若大战少林三神僧。原著里面的描述,张无忌身具多重神功,刚开始的时候跟三神僧是不相上下的,但是到了后期,张无忌的优势逐渐展开,占据了上风。

虽然新版的《倚天屠龙记》在很多细节上面都经不起推敲,但是不得不承认,这版的《倚天屠龙记》还是有一些可取的地方的。

在上面的javascript示例中,这就是所谓的回调。 我们实际上在做的是告诉我们的程序使用变量a和b运行函数doWork(),然后我们的最后一个参数是我们希望它在该函数完成后运行的函数。 所以当doWork()完成时,它会调用我们的函数,结果是doWork()。

这种设定是非常符合客观现实的,毕竟张无忌年轻,又具备了九阳神功、张三丰真传、乾坤大挪移等等,久战之下必然是张无忌获胜。

(专注娱乐八卦,喜欢请给个赞;原创作品,抄袭必究。)

虽然本文显然不是关闭闭包用例的详尽列表,但我希望这里讨论的内容能够让你清楚地了解它们的用途。闭包是一个非常强大和有用的工具,每个开发人员都应该习惯使用。

另外在救谢逊上面的处理也是一个败笔,原著里面张无忌是被三神僧牵制住无法出手,后面才有黄衣女子制止周芷若,合情合理!但是新版的《倚天屠龙记》里面,张无忌已跟三僧战罢,却眼睁睁地看着周芷若下手,此时他仿佛就像张三丰说教的那样,“你的功夫忘记了多少?”“全忘记了!”张无忌你的乾坤大挪移呢?比起用自己性命求情,不如直接出招制止周芷若。

现在我们可以编写处理函数,就像它们可以访问Database对象一样,同时仍然返回一个具有http.HandleFunc()期望的签名的函数。 这允许我们绕过http.HandleFunc()不允许我们传递自定义变量而不诉诸全局变量或任何类型的事实。

另外周颠这个角色也比以往的版本要出彩很多,承包了我们的笑点,符合他“颠”的设定。

让我们看一下简单的计时器中间件如何在Go中运行。

这种方法的第二个好处是doWork1()的作者不必担心编写函数的异步版本。如果你在Go中调用doWork1(),你可能希望整个程序等待该函数停止运行,然后一旦获得结果,它将继续运行。如果你需要同时运行该功能,你只需在上一个例子中的goroutine中运行它。

这种方法有两个主要的好处。首先,你正在做的事情非常清楚。虽然javascript示例可能不是很清楚,但很容易告诉doWork3()在doWork1()和doWork2()在Go代码中完成之后运行。很明显,这将同时发生,因为我们使用了go关键字。

闭包还可以用于将数据包装在函数内部,否则该函数通常不能访问该数据。例如,如果要在不使用全局变量的情况下提供对数据库的处理程序访问,则可以编写如下代码。

虽然可以在Go中创建这样的回调,但goroutines结合闭包使得以更易读的方式编写代码变得更加容易,如下所示。

如果你很幸运,你可能已经看到这是通过promises而不是嵌套函数完成的。 无论如何,乍一看有点令人困惑,你可能会问自己,“到底是怎么回事?”你第一次看到这样的代码。

2.包装函数和创建中间件

现在我们需要做的就是为处理程序设置时间是将它们包装在timed(处理程序)中并将闭包传递给http.HandleFunc()函数调用。

这个包为我们提供了大量有用的函数和代码,用于排序和搜索排序列表。 例如,如果要对整数切片进行排序,然后在切片中搜索数字7,则可以使用排序包。

但是剧组没有这样做,而是完全采用人工真实对抗,并没有完全依靠后期制作,这对于观众来说,也是一种负责,所以剧组在这方面做得还是比较出色的。

但是如果要搜索每个元素是自定义类型的切片会发生什么? 或者,如果要查找第一个数字7或更高的索引,而不仅仅是第一个7的索引?

假设你要创建一个函数,该函数可以访问即使在函数退出后仍然存在的数据。 例如,你想要计算调用函数的次数,或者你想要创建一个斐波那契数字生成器,但你不希望其他任何人访问该数据(因此他们不会意外地更改它)。 你可以使用闭包来实现此目的。

为此,你需要使用sort.Search()函数,并且需要传入一个闭包,该闭包可用于确定特定索引处的数字是否符合你的条件。

这与previos javascript示例基本相同,但我们使用了三个嵌套回调。 这意味着我们希望首先运行doWork1(),然后在完成后运行doWork2(),最后我们希望doWork3()在doWork2()完成后运行。

Go中的函数是一等公民。 这意味着你不仅可以动态创建匿名函数,还可以将函数作为参数传递给函数。 例如,在创建Web服务器时,通常提供处理对特定路由的Web请求的功能。