‫你好, 欢迎｡
‫在这堂课中, 我们将学习如何从我们自己的函数中删除执行引脚,
‫以及如何以及何时删除执行引脚是一个好主意｡
‫我们开始吧｡
‫所以有点奇怪的是, 我们的has ammo函数现在有了执行pin, 而以前我们不需要它,
‫这让我们的代码有点糟糕｡
‫那是什么？
‫为什么会发生这种情况？为什么有些功能节点需要执行管脚, 而其他功能节点不需要？
‫好吧, 这一切都归结为一种叫做副作用的东西｡
‫那么什么是副作用呢？
‫从本质上讲, 副作用是指函数在运行后具有某种可观察到的效果｡
‫现在, 我这样说是什么意思？
‫让我们看一些有副作用的函数的例子, 这样你就能理解prints, print, string｡
‫运行后打印字符串｡
‫很明显, 发生了一些事情, 因为现在屏幕上出现了一个字符串｡
‫你可以看到有一个弦加冲量, 它有一个明显的效果,
‫因为加了冲量的物体突然飞向远处｡
‫设置弹药有一个明显的效果, 因为在你设置弹药后, 变量中的值已经改变了｡
‫现在, 你可能会想, 每一个函数都有一个可观察到的效果｡
‫否则, 它还有什么意义呢？
‫不完全是｡
‫有纯粹的函数｡
‫什么是纯函数？
‫这基本上是一个没有副作用的功能｡
‫但是, 它确实有返回值｡
‫所以这个函数会产生一些值｡
‫这个函数的全部目的就是计算并给予这些值｡
‫让我们再看一些例子, 这样会更清楚｡
‫去拿弹药
‫这是一个纯函数｡
‫它没有副作用, 因为你可以得到弹药多次, 因为你喜欢｡
‫除非你用你从中得到的价值做些什么, 否则你的程序, 你的游戏不会有任何不同｡
‫你可以一直得到弹药, 所有的方式通过你的游戏, 没有什么会是可观察到的不同,
‫你的游戏｡
‫获取活动的正向矢量｡
‫这是另一个你可以得到它, 因为你喜欢很多次｡
‫它不会改变任何东西, 除非你对返回的值做一些事情, 以及所有这些数学函数,
‫比如乘减大于｡
‫所有这些节点都不会对您的项目产生影响, 除非它们的结果用于更大的用途｡
‫这些被称为纯函数, 你可能会看到这些节点没有任何执行引脚,
‫因为它们不需要这些引脚｡
‫不管我什么时候跑去拿弹药, 不管我跑50次还是一次, 这都不重要,
‫因为它没有明显的副作用｡
‫那么, 我们如何向蓝图表明一个函数是纯的呢？
‫好吧, 让我们看看我的测试函数｡
‫因此, 我将在事件图中选择它, 或者在我的蓝图窗格中选择它｡
‫您可以看到, 在详细信息窗格中有一个标记为pure的复选框｡
‫因此, 如果您选中该复选框, 请注意, 执行引脚刚刚消失｡
‫我们现在得到的是这个函数的输入和输出｡
‫现在, 只要我们需要输出, 这个函数就会运行｡
‫所以如果我把这个输出插入到一个打印字符串中, 那么它会在打印字符串之前运行这个函数,
‫这样它就能及时得到结果来执行打印字符串｡
‫我们可以对任何没有副作用的功能做同样的事情, 没有可观察到的影响,
‫比如我们的有弹药功能｡
‫所以我想挑战你把弹药变成一个纯粹的函数｡
‫因此, 选择它并设置复选框, 使其成为纯｡
‫以及执行流现在会发生什么情况｡
‫目前它所挂接的是通过什么功能｡
‫它通向哪里？
‫暂停视频, 开始体验｡
‫好吧, 我会的
‫欢迎回来｡
‫所以让我们选择有弹药｡
‫我们将选中pure复选框, 您会立即看到执行引脚消失,
‫之前流经has
‫ammo的执行流现在直接进入分支语句, 这正是我们现在想要的, has ammo将在分支语句运行以获取返回值时立即运行｡
‫现在, 请注意, 只有在您确定某个函数没有副作用时, 才使用此pure复选框｡
‫这种情况的常见情况和用例是当你的函数只是试图计算一个值, 比如has ammo｡
‫这就是为什么这个函数没有遵循动词命名的惯例, 因为它不是在做什么, 它是在得到什么,
‫或者它是在回答一个问题｡
‫在这种情况下, 问题是有没有弹药｡
‫事实上, 我们甚至可以在函数中加上一个问号,
‫命名一些你在Blueprint中可以做而在C++中不能做的事情, 这样我们就可以看到, 是的, 这个函数在回答一个问题｡
‫它并没有试图做什么｡
‫因此, 纯粹功能和非纯粹功能之间的区别通常在于它是否适合动词, 或者是否适合疑问句｡
‫为了复习, 让我们看一下词汇表｡
‫副作用是指我们已经看到的函数的可观察到的效果, 我们已经看到了这些函数的例子｡
‫而纯函数是指没有副作用的函数, 比如这些获取函数或者问题回答函数｡
‫这节课到此为止｡
‫下次见｡