TCL - 类 还是字典?

TCL - Classes or dictionaries?

我想存储跨越多个层级的数据。

例如:

存储汽车的数据结构可以存储每辆车的颜色、年龄和其他方面。

问题是:对于这个问题,使用字典或 OOP 更有意义吗?以及如何将这样的结构打印成 table 格式?

请想象一下,我不知道“先验”数据结构的层数(深度)。 请检查所附图片。

干杯,

佩德罗

如果您不打算将行为与该树中的每个节点放在一起(例如,每辆汽车都会有一个 turnOnEngine 方法吗?)那么使用一组嵌套的字典可能更容易。 Tcl 的 类 只有在您开始添加重要行为后才真正有意义,因为它们比简单的 dict 有更多的开销(每个命名空间!)。

只要整体结构是规则的,有很多重复的模式(正如你的图表似乎也显示的那样),在每个节点中存储“我知道我是什么”的信息并不是太重要。

如果只是为了 setting/retrieving key/value 对,我也建议使用嵌套字典而不是 OOP。

set cars {
    Porsche {
        color  black
        engine 3.2L
        fuel   petrol
    }

    Jeep {
        color  blue
        engine 1.6L
        fuel   diesel
    }
    Ferrari {
        color  red
        engine 4.8L
        fuel   petrol
    }
}


# Get a value
set Porsche [dict get $cars Porsche]
dict get $Porsche color
  --> black

# Get a value with nested keys
dict get $cars Ferrari color
  --> red

# Change a value with nested keys
dict set cars Jeep color yellow

对于具有两个嵌套键的深度,这将生成 table。
任何更深的嵌套键都将打印在 $value 中,但在一行中。

dict for {car_name car_dict} $cars {
    dict for {key value} $car_dict {
        puts [format "%-15s %-15s %s" $car_name $key $value]
    }
}

有一些选项可以漂亮地打印字典(例如,https://wiki.tcl-lang.org/page/pdict%3A+Pretty+print+a+dict

您可能想要反转字典以table您想要的方式。

set reverse_dict [dict create]
dict for {car_name car_dict} $cars {
    dict for {key value} $car_dict {
        dict set reverse_dict $key $car_name $value
    }
}

set keys [dict keys $reverse_dict]                           
set number_of_columns [expr {[llength $keys] + 1}]
set fmt [lrepeat $number_of_columns "%-15s"]
puts [format $fmt Car {*}$keys]
puts [format $fmt {*}[lrepeat $number_of_columns "------------"]]
foreach car [dict keys $cars] {
    set values [lmap k $keys {dict get $cars $car $k}]
    puts [format $fmt $car {*}$values]
}

可能有很多解决方案。