2

我对 Coffeescript 树实现中的意外行为有疑问,想知道是否有人可以提供帮助。我认为问题与错误的“this”上下文有关,但我不确定在哪里放置粗箭头来解决它。也许比我更了解咖啡脚本的人可以解释这种行为?

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()

我认为这会无限重复,因为“打印”的上下文没有像我打算的那样设置为子节点对象的上下文。我会很感激任何指导。

D.

4

1 回答 1

0

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

class MultiNode extends Node
    branches: {}

这附加branchesMultiNode类,因此所有实例通过它们的原型MultiNode共享完全相同的内容。@branches由于显而易见的原因,这会使事情变得一团糟。你在类级别定义的任何东西都是原型的一部分,除非你自己做,否则这些都不会被复制到实例中。

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

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

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

经验法则:

永远不要在 (Coffee|Java)Script 中的类/原型中定义可变值,总是在构造函数中定义那些每个实例(当然,除非你想共享......)。


PS:你不必说:

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

你可以这样说:

node?.print "#{str}  "
于 2013-08-05T03:54:30.793 回答