﻿1
00:00:04,270 --> 00:00:05,530
‫你好, 欢迎｡

2
00:00:05,530 --> 00:00:11,830
‫在这堂课中, 我们将学习如何从我们自己的函数中删除执行引脚,

3
00:00:11,830 --> 00:00:15,760
‫以及如何以及何时删除执行引脚是一个好主意｡

4
00:00:15,760 --> 00:00:16,690
‫我们开始吧｡

5
00:00:16,960 --> 00:00:23,560
‫所以有点奇怪的是, 我们的has ammo函数现在有了执行pin, 而以前我们不需要它,

6
00:00:23,560 --> 00:00:27,610
‫这让我们的代码有点糟糕｡

7
00:00:27,610 --> 00:00:29,110
‫那是什么？

8
00:00:29,110 --> 00:00:35,710
‫为什么会发生这种情况？为什么有些功能节点需要执行管脚, 而其他功能节点不需要？

9
00:00:35,710 --> 00:00:39,850
‫好吧, 这一切都归结为一种叫做副作用的东西｡

10
00:00:39,850 --> 00:00:42,250
‫那么什么是副作用呢？

11
00:00:42,250 --> 00:00:50,260
‫从本质上讲, 副作用是指函数在运行后具有某种可观察到的效果｡

12
00:00:50,350 --> 00:00:52,090
‫现在, 我这样说是什么意思？

13
00:00:52,090 --> 00:00:58,420
‫让我们看一些有副作用的函数的例子, 这样你就能理解prints, print, string｡

14
00:00:58,870 --> 00:01:01,090
‫运行后打印字符串｡

15
00:01:01,090 --> 00:01:05,860
‫很明显, 发生了一些事情, 因为现在屏幕上出现了一个字符串｡

16
00:01:05,860 --> 00:01:12,490
‫你可以看到有一个弦加冲量, 它有一个明显的效果,

17
00:01:12,490 --> 00:01:16,960
‫因为加了冲量的物体突然飞向远处｡

18
00:01:17,440 --> 00:01:25,210
‫设置弹药有一个明显的效果, 因为在你设置弹药后, 变量中的值已经改变了｡

19
00:01:25,210 --> 00:01:29,320
‫现在, 你可能会想, 每一个函数都有一个可观察到的效果｡

20
00:01:29,320 --> 00:01:31,540
‫否则, 它还有什么意义呢？

21
00:01:31,600 --> 00:01:32,740
‫不完全是｡

22
00:01:32,740 --> 00:01:35,590
‫有纯粹的函数｡

23
00:01:35,590 --> 00:01:37,600
‫什么是纯函数？

24
00:01:38,200 --> 00:01:41,170
‫这基本上是一个没有副作用的功能｡

25
00:01:41,170 --> 00:01:45,040
‫但是, 它确实有返回值｡

26
00:01:45,040 --> 00:01:47,380
‫所以这个函数会产生一些值｡

27
00:01:47,380 --> 00:01:53,830
‫这个函数的全部目的就是计算并给予这些值｡

28
00:01:53,830 --> 00:01:57,250
‫让我们再看一些例子, 这样会更清楚｡

29
00:01:57,520 --> 00:01:58,570
‫去拿弹药

30
00:01:58,570 --> 00:02:01,090
‫这是一个纯函数｡

31
00:02:01,090 --> 00:02:06,640
‫它没有副作用, 因为你可以得到弹药多次, 因为你喜欢｡

32
00:02:06,640 --> 00:02:14,380
‫除非你用你从中得到的价值做些什么, 否则你的程序, 你的游戏不会有任何不同｡

33
00:02:14,380 --> 00:02:20,320
‫你可以一直得到弹药, 所有的方式通过你的游戏, 没有什么会是可观察到的不同,

34
00:02:20,320 --> 00:02:22,780
‫你的游戏｡

35
00:02:22,810 --> 00:02:24,910
‫获取活动的正向矢量｡

36
00:02:24,910 --> 00:02:27,730
‫这是另一个你可以得到它, 因为你喜欢很多次｡

37
00:02:27,730 --> 00:02:34,330
‫它不会改变任何东西, 除非你对返回的值做一些事情, 以及所有这些数学函数,

38
00:02:34,330 --> 00:02:37,900
‫比如乘减大于｡

39
00:02:37,900 --> 00:02:47,260
‫所有这些节点都不会对您的项目产生影响, 除非它们的结果用于更大的用途｡

40
00:02:47,260 --> 00:02:53,290
‫这些被称为纯函数, 你可能会看到这些节点没有任何执行引脚,

41
00:02:53,290 --> 00:02:56,920
‫因为它们不需要这些引脚｡

42
00:02:56,920 --> 00:03:04,330
‫不管我什么时候跑去拿弹药, 不管我跑50次还是一次, 这都不重要,

43
00:03:04,330 --> 00:03:08,320
‫因为它没有明显的副作用｡

44
00:03:08,560 --> 00:03:13,540
‫那么, 我们如何向蓝图表明一个函数是纯的呢？

45
00:03:13,660 --> 00:03:16,150
‫好吧, 让我们看看我的测试函数｡

46
00:03:16,150 --> 00:03:20,800
‫因此, 我将在事件图中选择它, 或者在我的蓝图窗格中选择它｡

47
00:03:21,010 --> 00:03:25,870
‫您可以看到, 在详细信息窗格中有一个标记为pure的复选框｡

48
00:03:25,870 --> 00:03:31,150
‫因此, 如果您选中该复选框, 请注意, 执行引脚刚刚消失｡

49
00:03:31,150 --> 00:03:35,410
‫我们现在得到的是这个函数的输入和输出｡

50
00:03:35,410 --> 00:03:40,120
‫现在, 只要我们需要输出, 这个函数就会运行｡

51
00:03:40,120 --> 00:03:46,750
‫所以如果我把这个输出插入到一个打印字符串中, 那么它会在打印字符串之前运行这个函数,

52
00:03:46,750 --> 00:03:51,910
‫这样它就能及时得到结果来执行打印字符串｡

53
00:03:51,910 --> 00:03:57,700
‫我们可以对任何没有副作用的功能做同样的事情, 没有可观察到的影响,

54
00:03:57,700 --> 00:04:01,450
‫比如我们的有弹药功能｡

55
00:04:01,450 --> 00:04:06,280
‫所以我想挑战你把弹药变成一个纯粹的函数｡

56
00:04:06,280 --> 00:04:10,150
‫因此, 选择它并设置复选框, 使其成为纯｡

57
00:04:10,360 --> 00:04:14,380
‫以及执行流现在会发生什么情况｡

58
00:04:14,380 --> 00:04:17,380
‫目前它所挂接的是通过什么功能｡

59
00:04:17,380 --> 00:04:18,600
‫它通向哪里？

60
00:04:18,610 --> 00:04:20,770
‫暂停视频, 开始体验｡

61
00:04:23,870 --> 00:04:24,410
‫好吧, 我会的

62
00:04:24,410 --> 00:04:25,360
‫欢迎回来｡

63
00:04:25,370 --> 00:04:27,460
‫所以让我们选择有弹药｡

64
00:04:27,470 --> 00:04:34,760
‫我们将选中pure复选框, 您会立即看到执行引脚消失,

65
00:04:34,760 --> 00:04:41,360
‫之前流经has

66
00:04:41,360 --> 00:04:51,820
‫ammo的执行流现在直接进入分支语句, 这正是我们现在想要的, has ammo将在分支语句运行以获取返回值时立即运行｡

67
00:04:51,830 --> 00:05:00,500
‫现在, 请注意, 只有在您确定某个函数没有副作用时, 才使用此pure复选框｡

68
00:05:00,500 --> 00:05:09,290
‫这种情况的常见情况和用例是当你的函数只是试图计算一个值, 比如has ammo｡

69
00:05:09,290 --> 00:05:17,540
‫这就是为什么这个函数没有遵循动词命名的惯例, 因为它不是在做什么, 它是在得到什么,

70
00:05:17,540 --> 00:05:21,980
‫或者它是在回答一个问题｡

71
00:05:21,980 --> 00:05:24,680
‫在这种情况下, 问题是有没有弹药｡

72
00:05:24,680 --> 00:05:29,330
‫事实上, 我们甚至可以在函数中加上一个问号,

73
00:05:29,330 --> 00:05:36,080
‫命名一些你在Blueprint中可以做而在C++中不能做的事情, 这样我们就可以看到, 是的, 这个函数在回答一个问题｡

74
00:05:36,080 --> 00:05:37,850
‫它并没有试图做什么｡

75
00:05:37,850 --> 00:05:46,490
‫因此, 纯粹功能和非纯粹功能之间的区别通常在于它是否适合动词, 或者是否适合疑问句｡

76
00:05:46,490 --> 00:05:49,160
‫为了复习, 让我们看一下词汇表｡

77
00:05:49,430 --> 00:05:56,660
‫副作用是指我们已经看到的函数的可观察到的效果, 我们已经看到了这些函数的例子｡

78
00:05:56,660 --> 00:06:05,270
‫而纯函数是指没有副作用的函数, 比如这些获取函数或者问题回答函数｡

79
00:06:05,390 --> 00:06:06,680
‫这节课到此为止｡

80
00:06:06,680 --> 00:06:08,120
‫下次见｡

