显然这些模式变量不像我期望的那样工作。这是一个简单的例子:
In[264] := 1 /. x_ -> {x, f[x], ToString[x]}
Out[264] := {1, f[1], "x"}
为什么最后一个元素是“x”而不是“1”。以下工作符合预期。
In[267]:= y = 2;
ToString[y]
Out[268]= "2"
感谢,
罗布
答案 0 :(得分:4)
在替换发生之前,正在评估规则的右侧,因此您需要使用RuleDelayed
(:>
)而不是Rule
(->
) :
In[1]:= 1 /. x_ :> {x, f[x], ToString[x]}
Out[1]= {1, f[1], "1"}
Rule
和RuleDelayed
类似于Set
(=
)和SetDelayed
(:=
)。
HTH!
答案 1 :(得分:3)
试试Trace[1 /. x_ -> {x, f[x], ToString[x]}]
。我目前无法访问mathematica,但我相信您会看到替换,特别是ToString[x]
,在应用模式之前进行评估,因此您实际上是有效的重新做1 /. x_ -> {x, f[x], "x"}
。