Am 04.07.24 um 09:17 schrieb Mark Summerfield:
I am trying to learn TclOO. I have created two classes P and Q which
appear to have identical behavior. Class P uses "my variable" and Q uses
"variable". Can someone explain the difference between them. (I am
familiar with Python and Go if that's any help with explaining.)
Hello Mark,
I have replaced your demo, hope that's OK.
Different when there are multiple variables as arguments. Originally I expected the opposite behavior. I had misunderstood that until now.
#DemoClass1 and DemoClass2
# difference constructor with variable individually or together
# difference output for instanceVar2, no initialization with 15 (DemoClass1)
#DemoClass3 and DemoClass4
# no difference with my variable individually or together
# in example:
# objx1 with my variable, x for DemoClass
# objx2 with variable, x for DemoClass
oo::class create DemoClass1 {
constructor {val1 val2} {
variable instanceVar1 instanceVar2
set instanceVar1 $val1
set instanceVar2 $val2
}
method incrementInstanceVarsWithMy {} {
my variable instanceVar1 instanceVar2
incr instanceVar1
incr instanceVar2
}
method incrementInstanceVarsWithVariable {} {
variable instanceVar1
variable instanceVar2
incr instanceVar1
incr instanceVar2
}
method getInstanceVarsWithMy {} {
my variable instanceVar1 instanceVar2
return "instanceVar1: $instanceVar1, \
instanceVar2: $instanceVar2"
}
method getInstanceVarsWithVariable {} {
variable instanceVar1
variable instanceVar2
return "instanceVar1: $instanceVar1, \
instanceVar2: $instanceVar2"
}
}
oo::class create DemoClass2 {
constructor {val1 val2} {
variable instanceVar1
variable instanceVar2
set instanceVar1 $val1
set instanceVar2 $val2
}
method incrementInstanceVarsWithMy {} {
my variable instanceVar1 instanceVar2
incr instanceVar1
incr instanceVar2
}
method incrementInstanceVarsWithVariable {} {
variable instanceVar1
variable instanceVar2
incr instanceVar1
incr instanceVar2
}
method getInstanceVarsWithMy {} {
my variable instanceVar1 instanceVar2
return "instanceVar1: $instanceVar1, \
instanceVar2: $instanceVar2"
}
method getInstanceVarsWithVariable {} {
variable instanceVar1
variable instanceVar2
return "instanceVar1: $instanceVar1, \
instanceVar2: $instanceVar2"
}
}
oo::class create DemoClass3 {
constructor {val1 val2} {
my variable instanceVar1 instanceVar2
set instanceVar1 $val1
set instanceVar2 $val2
}
method incrementInstanceVarsWithMy {} {
my variable instanceVar1 instanceVar2
incr instanceVar1
incr instanceVar2
}
method incrementInstanceVarsWithVariable {} {
variable instanceVar1
variable instanceVar2
incr instanceVar1
incr instanceVar2
}
method getInstanceVarsWithMy {} {
my variable instanceVar1 instanceVar2
return "instanceVar1: $instanceVar1, \
instanceVar2: $instanceVar2"
}
method getInstanceVarsWithVariable {} {
variable instanceVar1
variable instanceVar2
return "instanceVar1: $instanceVar1, \
instanceVar2: $instanceVar2"
}
}
oo::class create DemoClass4 {
constructor {val1 val2} {
my variable instanceVar1
my variable instanceVar2
set instanceVar1 $val1
set instanceVar2 $val2
}
method incrementInstanceVarsWithMy {} {
my variable instanceVar1
my variable instanceVar2
incr instanceVar1
incr instanceVar2
}
method incrementInstanceVarsWithVariable {} {
variable instanceVar1
variable instanceVar2
incr instanceVar1
incr instanceVar2
}
method getInstanceVarsWithMy {} {
my variable instanceVar1
my variable instanceVar2
return "instanceVar1: $instanceVar1, \
instanceVar2: $instanceVar2"
}
method getInstanceVarsWithVariable {} {
variable instanceVar1
variable instanceVar2
return "instanceVar1: $instanceVar1, \
instanceVar2: $instanceVar2"
}
}
puts "DemoClass1"
puts " obj11"
set obj11 [DemoClass1 new 5 1]
$obj11 incrementInstanceVarsWithMy
puts "obj11: [$obj11 getInstanceVarsWithMy]"
puts " obj12"
set obj12 [DemoClass1 new 15 10]
$obj12 incrementInstanceVarsWithVariable
puts "obj12: [$obj12 getInstanceVarsWithVariable]"
puts \n
puts "DemoClass2"
puts " obj21"
set obj21 [DemoClass2 new 5 1]
$obj21 incrementInstanceVarsWithMy
puts "obj21: [$obj21 getInstanceVarsWithMy]"
puts " obj22"
set obj22 [DemoClass2 new 15 10]
$obj22 incrementInstanceVarsWithVariable
puts "obj22: [$obj22 getInstanceVarsWithVariable]"
puts \n
puts "DemoClass3"
puts " obj31"
set obj31 [DemoClass3 new 5 1]
$obj31 incrementInstanceVarsWithMy
puts "obj31: [$obj31 getInstanceVarsWithMy]"
puts " obj32"
set obj32 [DemoClass3 new 15 10]
$obj32 incrementInstanceVarsWithVariable
puts "obj32: [$obj32 getInstanceVarsWithVariable]"
puts \n
puts "DemoClass4"
puts " obj41"
set obj41 [DemoClass4 new 5 1]
$obj41 incrementInstanceVarsWithMy
puts "obj41: [$obj41 getInstanceVarsWithMy]"
puts " obj42"
set obj42 [DemoClass4 new 15 10]
$obj42 incrementInstanceVarsWithVariable
puts "obj42: [$obj42 getInstanceVarsWithVariable]"
if {0} {
Output:
DemoClass1
obj11
obj11: instanceVar1: 6, instanceVar2: 1
obj12
obj12: instanceVar1: 16, instanceVar2: 1
DemoClass2
obj21
obj21: instanceVar1: 6, instanceVar2: 2
obj22
obj22: instanceVar1: 16, instanceVar2: 11
DemoClass3
obj31
obj31: instanceVar1: 6, instanceVar2: 2
obj32
obj32: instanceVar1: 16, instanceVar2: 11
DemoClass4
obj41
obj41: instanceVar1: 6, instanceVar2: 2
obj42
obj42: instanceVar1: 16, instanceVar2: 11
}