code
数据流与所有权content
数据流与所有权
节点之间的连线是数据的流动方向。但「取一个出参」到底意味着什么,取决于这个节点有没有控制流。执行节点、事件(列表迭代循环除外)属于这一类。节点本身储存了它的所有出参。取它们的出参,就像读一个局部变量 —— 拿到的就是上次执行时存下来的那份值,不会重新计算。查询节点、运算节点(局部变量除外)属于这一类。它们不储存出参。每次取它们的出参,都会重新获取入参并重新计算一遍。这意味着:把同一个运算节点的同一个出参接到 N 个地方,图上就是 N 次计算。- 入参既没连接也没设置值时,用该类型的默认值
- 可执行节点如果从未被执行过(包括之前的事件里也没执行过),它的出参也是该类型的默认值
结构体的默认值在结构体定义里设置。节点图变量、局部变量、列表/结构体的成员,以及被储存的出参 —— 这些位置持有数据本身,而不是引用。把数据放进它们时会发生一次克隆。其它地方(函数参数、临时值等)都是引用(借用)。所以在图上,一次赋值可能对应一次实际的深拷贝 —— 写代码时留意结构体有多大。算术节点里有个叫模运算的节点,它实际做的是取余而不是取模 —— 这正是 Rust 的 % 对整数的语义(-7 % 3 == -1,而不是取模的 2)。所以从 Rust 代码看没有差异,但手工读节点图时别被名字误导。