我有一个示例proc
record_id machine_id date_start date_end
1 EQPT-1 10-27-2015
2 EQPT-1 10-28-2015
3 EQPT-2 10-28-2015
4 EQPT-3 10-28-2015
5 EQPT-3 10-30-2015
6 EQPT-2 10-30-2015
UPDATE machine_log
SET prev.date_end = new.date_start
WHERE new.machine_id = prev.machine_id
AND new.record_id != prev.record_id
在上面的proc执行之后,我将在单个列表中获得所有b c d值,所以如果我只需要来自上面的proc的b值,那么现在正在做[lindex [exam] 1]。 我正在寻找其他方式以不同的方式获得输出而不是使用lindex或returun_value(b)可以给出我的预期输出
答案 0 :(得分:3)
您可以使用dict
并选择此类键值映射,以明确您的意图:
return [dict create width 10 height 200 depth 8]
我认为Tcl中没有办法返回除复合数据结构之外的多个值或yield
中的coroutine
。
答案 1 :(得分:3)
返回多个值的常用方法是列表。这可以在呼叫站点与lassign
一起使用,以便列表立即分成多个变量。
proc exam {args} {
set input "This is my world"
regexp {(This) (is) (my) (world)} $input all a b c d
set x "$a $b $c $d"
return $x
}
lassign [exam ...] p d q bach
您还可以返回字典。在这种情况下,dict with
是一种方便的解包方式:
proc exam {args} {
set input "This is my world"
regexp {(This) (is) (my) (world)} $input all a b c d
return [dict create a $a b $b c $c d $d]
}
set result [exam ...]
dict with result {}
# Now just use $a, $b, $c and $d
最后,您还可以在upvar
内使用exam
将调用者的变量放入范围,尽管通常最明智的做法是只使用调用者为您提供名称的变量。
proc exam {return_var} {
upvar 1 $return_var var
set input "This is my world"
regexp {(This) (is) (my) (world)} $input all a b c d
set var "$a $b $c $d"
return
}
exam myResults
puts "the third element is now [lindex $myResults 2]"