Скажем, я хочу изменить число или какой-то другой примитив внутри функции.Например, что-то вроде этого (примечание: псевдокод):
// apply fn to every value in a tree, in-order traversal
function treeReduce (tree, fn, result):
if (tree == undefined) return
treeReduce(tree.left, fn, result)
result = fn(result, tree.value)
treeReduce(tree.right, fn, result)
sum = 0
treeReduce(myTree, +, sum)
очевидно, что это не сработает, потому что result
просто переназначается, а переданный sum
не увидит изменений,Таким образом, общий способ, которым я обошел это (на любом языке передачи по значению, например Python или Javascript), использует обертки:
// apply fn to every value in a tree, in-order traversal
function treeReduce (tree, fn, result):
if (tree == undefined) return
treeReduce(tree.left, fn, result)
result[0] = fn(result[0], tree.value)
treeReduce(tree.right, fn, result)
sumWrapper = [0]
treeReduce(myTree, +, sumWrapper)
Тем не менее, я недавно искал в Интернете, чтобы увидеть, является ли это распространенным явлением.шаблон, и не могу найти много информации об этом.В частности, я хотел бы знать три вещи:
- это общий шаблон?
- это хорошая практика?
- , если нет, какие-либо альтернативы?