Вероятно, было бы лучше иметь конструктор, а не метод init:
constructor val {
lassign $val x y z
}
set P0 [Point new {8.2 30 40}]
или
constructor args {
lassign $args x y z
}
set P0 [Point new 8.2 30 40]
С точки зрения ООП, точка без координат не имеет особого смысла, и вы, вероятно, не хотите «перемещать» точку путем изменения координат, поэтому координаты должны быть назначены при создании точки, а точка заменена с новым, если предмет, которому принадлежит точка, перемещается.
Это хорошая идея, чтобы изменить значения координат методом formatPoint? Почему бы не позволить координатам сохранять свои значения и предоставлять форматированный доступ:
method formatPoint {} {
format {%.4f %.4f %.4f} $x $y $z
}
Методы доступа к координатам немного отключены. Попробуйте
method x {} {
set x
}
вместо этого: унарная форма множества возвращает значение. Или
method x {} {
return $x
}
если вы предпочитаете.
Вычисление дает правильный результат (~ 36.0789), но имейте в виду, что вам не нужно экранировать окончания строк в фигурных скобках выражения (поскольку окончания строк уже экранированы фигурными скобками).