PGF/TikZ 面向对象编程范围问题

PGF/TikZ 面向对象编程范围问题

我正在尝试使用 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)%
}%

相关内容