Red语言函数式编程中序列按值传递的实现方式问询
Red序列参数按值传递的实现方案
嘿,很高兴看到你在啃《Red编程》这本书!关于你提到的序列参数传递的困惑,我来给你拆解下可行的解决办法:
Red本身并没有内置的全局开关能让序列默认按值传递——毕竟它默认的引用传递是出于性能考量(避免大序列的无意义复制)。不过你完全可以通过显式复制参数的方式,实现和标量一样的“函数内操作不影响外部”的效果,具体有两种常用方式:
1. 浅复制:用copy函数
如果你的序列里只有标量元素(比如字符串、数字这类),直接用copy函数复制传入的序列即可。复制后的序列和原序列完全独立,函数内的操作只会作用在副本上:
; 定义一个不会修改原序列的函数 safe-append: func [input-seq [series!] new-item] [ local copied-seq copied-seq: copy input-seq ; 显式复制参数 append copied-seq new-item copied-seq ; 返回修改后的副本 ] original: ["apple" "banana"] updated: safe-append original "cherry" print original ; 输出 ["apple" "banana"],原序列未被修改 print updated ; 输出 ["apple" "banana" "cherry"]
2. 深复制:用deep-copy函数
如果你的序列里嵌套了其他系列(比如序列里包含另一个序列、对象等),copy的浅复制就不够了——它只会复制外层序列,嵌套的元素还是引用关系。这时候需要用deep-copy递归复制所有层级的元素:
safe-modify-nested: func [input-seq [series!]] [ local copied-seq copied-seq: deep-copy input-seq ; 递归复制所有嵌套元素 append copied-seq/1 " (modified)" copied-seq ] original: [["red" "blue"] "green"] updated: safe-modify-nested original print original/1 ; 输出 ["red" "blue"],原嵌套序列未被修改 print updated/1 ; 输出 ["red" "blue" " (modified)"]
简单总结下:Red没有让序列自动按值传递的选项,但通过copy或deep-copy显式复制参数,完全能实现你想要的函数式范式里“无副作用”的效果,和ML的不可变序列逻辑其实是相通的,只是需要你手动触发复制步骤而已。
内容的提问来源于stack exchange,提问作者user3908316
相关产品推荐
相关产品推荐

