CoffeeScript递归函数

时间:2013-08-05 03:36:14

标签: recursion tree coffeescript

我对Coffeescript树实现中的意外行为有疑问,并想知道是否有人可以提供帮助。我认为问题在于错误的“这个”背景,但我不知道在哪里放下胖箭来解决它。也许有人比我更了解咖啡因可以解释这种行为?

class Node
    uuid: undefined

    constructor: (@uuid) ->

class MultiNode extends Node
    branches: {}

    constructor: (args...) ->
        super(args...)

    print: (str = '') ->
        console.log "#{str}Multiway<#{@uuid}>"
        for value,node of @branches
            if node?
                node.print "#{str}  "

class LeafNode extends Node
    value: undefined

    constructor: (@value, args...) ->
        super(args...)

    print: (str = '') ->
        console.log "#{str}Leaf<#{@uuid}>: #{@value}"

tree = new MultiNode(1)
subtree1 = new MultiNode(2)
subtree1.branches["aa"] = new LeafNode("three",3)
subtree1.branches["ab"] = new LeafNode("four",4)
tree.branches["a"] = subtree1
subtree2 = new MultiNode(5)
subtree2.branches["ba"] = new LeafNode("six",6)
subtree2.branches["bb"] = new LeafNode("seven",7)
tree.branches["b"] = subtree2
tree.print()

这无限地说,我认为因为'print'的上下文没有像我打算那样设置 子节点对象的那个。我很感激任何指导。

d

1 个答案:

答案 0 :(得分:0)

我认为问题在于你如何定义branches

class MultiNode extends Node
    branches: {}

branches附加到MultiNode类,以便所有MultiNode个实例通过其原型共享完全相同的@branches。由于显而易见的原因,这将造成大量混乱。您在类级别定义的任何内容都是原型的一部分,除非您自己执行,否则这些内容都不会复制到实例中。

您需要做的就是确保每个MultiNode实例都有自己的@branches

class MultiNode extends Node
    constructor: (args...) ->
        @branches = { }
        super(args...)
    #...

演示:http://jsfiddle.net/ambiguous/vkacZ/

经验法则:

  

永远不要在(Coffee | Java)脚本中的类/原型中定义可变值,始终在构造函数中定义每个实例(除非您想要共享...)。


PS:你不必说:

if node?
    node.print "#{str}  "

你可以这样说:

node?.print "#{str}  "