我正在尝试使用 PGF/TikZ 面向对象编程功能,遇到了一个我不明白的范围问题。我在下面提供了该问题的最小示例。
在此示例中,我创建了一个名为 Value 的类来存储数据。然后,我对其中两个 Value 执行添加操作,并在该过程中创建一个新的 Value 对象。添加操作将两个 Value 和所需的输出 Value 名称作为输入。
当从头创建两个值时,这种方法可以按预期工作,但是当加法运算的输入之一本身是前一个加法运算的输出时,这种方法就不行了,因为加法运算会更新输入值的值,而这是不应该的。
\documentclass{article}
\usepackage{tikz}
\usepgfmodule{oo}
\usepackage[nomessages]{fp}
\pgfooclass{Value}{
\attribute data;
\method Value(#1) {
\pgfooset{data}{#1}
}
\method getdata(#1) {
\pgfooget{data}{#1}
}
\method setdata(#1) {
\pgfooset{data}{#1}
}
\method show() {
\pgfooget{data}\tempdata
\pgfoothis.get id(\tempid)
Value(data: \tempdata)
}
}
% Define the add function outside the class
\def\addValues(#1,#2,#3) {
Performing Add Operation:
% Get data
#1.getdata(\selfdata)
#2.getdata(\otherdata)
% Compute the new data
\FPeval\newdata{\selfdata + \otherdata}
% \selfdata is updated here incorrectly on the second call
% Create the new Value object with the computed data
\expandafter\pgfoonew\csname #3\endcsname=new Value(\newdata)
}
\begin{document}
\pgfoonew \x=new Value(5)
x: \x.show() % Value(data: 5)
\pgfoonew \y=new Value(4)
y: \y.show() % Value(data: 4)
\addValues(\x,\y,z) % This works without issue since x and y are created from scratch
z: \z.show() % Value(data: 9.000000000000000000)
\pgfoonew \v=new Value(3)
v: \v.show() % Value(data: 3)
\addValues(\z,\v,o) % This doesn't work and \z data value is incorrectly updated by the line \FPeval\newdata{\selfdata + \otherdata}
o: \o.show() % Value(data: 12.000000000000000000)
z: \z.show() % Should still show Value(data: 9.000000000000000000) but now Value(data: 12.000000000000000000)
\pgfoonew \k=new Value(20)
k: \k.show() % Value(data: 5)
\pgfoonew \j=new Value(2)
j: \j.show() % Value(data: 4)
\addValues(\k,\j,l)
l: \l.show() % Value(data: 20.000000000000000000) works fine.
\end{document}
答案1
在
\expandafter\pgfoonew\csname #3\endcsname=new Value(\newdata)
您正在分配的值,#3
而\newdata
不是价值的\newdata
。可能最简单的解决方法是使用\expanded
:
\expanded{%
\noexpand\pgfoonew\expandafter\noexpand\csname #3\endcsname=new Value(\newdata)%
}%