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]
}
可能有很多解决方案。
我想存储跨越多个层级的数据。
例如:
存储汽车的数据结构可以存储每辆车的颜色、年龄和其他方面。
问题是:对于这个问题,使用字典或 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]
}
可能有很多解决方案。