首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >斯威夫特:为什么所有的变量在默认情况下都是懒惰的?

斯威夫特:为什么所有的变量在默认情况下都是懒惰的?
EN

Stack Overflow用户
提问于 2016-01-17 18:21:11
回答 4查看 1.9K关注 0票数 13

在比较这两个用于定义实例属性的选项时:

var networkManager = NetworkManager.sharedInstance() 变量惰性networkManager = NetworkManager.sharedInstance()

两者均:

  • 可以对块进行计算以获得值。
  • 可以内联声明(而不是块,如上面所示)

懒惰:

  • 可以指自己
  • 直到需要时才计算出来。
  • 如果你不使用它,它是没有计算出来的。

不懒惰的:

  • 没有任何好处

似乎永远使用非惰性变量没有好处。那么,为什么语言允许程序员做出这种劣等的选择呢?

(我不是在问var和letàla Swift常量默认是懒惰的吗?之间的区别)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-01-17 18:23:59

一个原因可能是,当评估发生时,懒散并不适合于你想要控制的情况。在分配中所做的工作有副作用的情况下,这是相关的。

虽然这与封闭有关,但斯图尔特塞拉的博客帖子很好地解释了这个想法,我认为它同样适用于任何语言。

票数 9
EN

Stack Overflow用户

发布于 2016-01-17 22:28:39

正如其他人已经说过的,有几种关键的场景,您希望属性的初始化是deterministic.。

这是一个与游戏开发相关的示例(以及其他许多例子)。

通常,表示游戏场景/级别中项的类的实例是在开始级别的之前创建的。

初始化可能是一项耗费时间的任务(从持久存储加载内存、分配内存、准备实例.)并且在玩家开始播放这个级别之前完成这个部分,可以避免CPU开销

这一点至关重要,因为一个级别中间的CPU开销可能会导致帧速率下降,这对用户体验来说是一场噩梦。

票数 7
EN

Stack Overflow用户

发布于 2016-01-18 02:26:30

仅供参考。我的感觉是斯威夫特想要变得更像一种功能语言,并希望在更多的地方懒惰实例化。

随着时间的推移,斯威夫特的早期评估表现得相当不错(嗯,“非功能性”部分)。在以后的版本中,我没有预料到Swift会比函数更倾向于方法)。Swift不是一种功能语言,也不打算成为一种语言。这经常出现在WWDC的谈话,论坛上,推特上,和Swift团队的谈话中。最初,所有的地图和过滤器都是懒惰的。斯威夫特把它去掉了,因为它造成了一些问题。在这个问题上最好的话题可能是“用Swift构建更好的价值类型应用程序”。正如他们所说:

我们喜欢突变。我们认为它很值钱。我们认为,正确地使用它是容易的。

你不会得到比这更多的“非功能性”。Swift还包含不可变的数据。但是函数编程是关于不可变数据上的纯函数,而不是Swift。

(当然有很多非懒惰的函数式语言。懒惰和功能是正交的概念。哈斯克尔刚好同时拥抱了这两个人。)

不过,就眼前的问题而言:

我发现lazy属性在现实世界的Swift中很少有用(我很慷慨;我从未遇到过将它保存在代码中的情况)。它不能提供像你在哈斯克尔那样的懒惰。它不安全,,所以这是个噩梦。它强迫您进入引用类型(或强制您的结构是可变的),这样可能会很烦人。如果我听说他们把它从语言里拉出来,而我们只需要用自己的语言,那我就没问题了。(我很想写一份这样做的提案。)它实现了一种特定的备忘录模式,这种模式有时很方便,但通常不是您想要的。所以它不是默认的,这是一件非常好的事情。

您可能知道,默认情况下,全局变量和类变量是懒惰的,而且我认为这很好,因为它们的数量非常少,它们在实践中被访问的可能性要大得多,而惰性是线程安全的(这是有代价的,但由于它们非常稀少,成本要低得多)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34841915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档