顯然這些模式變量不像我所預期的那樣工作。這裏有一個簡單的例子:爲什麼這個mathematica模式變量沒有被評估?
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"
感謝,
羅布
顯然這些模式變量不像我所預期的那樣工作。這裏有一個簡單的例子:爲什麼這個mathematica模式變量沒有被評估?
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"
感謝,
羅布
發生替換前規則的右手邊正在接受評估,所以你需要使用RuleDelayed
(:>
),而不是Rule
(->
):
In[1]:= 1 /. x_ :> {x, f[x], ToString[x]}
Out[1]= {1, f[1], "1"}
Rule
和RuleDelayed
類似於Set
(=
)和SetDelayed
(:=
)。
HTH!
嘗試Trace[1 /. x_ -> {x, f[x], ToString[x]}]
。我目前無法訪問mathematica,但我相信您會看到替換項(特別是ToString[x]
)在應用之前評估爲,因此您正在執行1 /. x_ -> {x, f[x], "x"}
。
對,你想使用'RuleDelayed',也就是':>'而不是' - >'('Rule')。 – 2010-11-07 21:23:14
@Michael:你應該把它作爲一個單獨的答案發布,所以我可以放棄它,OP可以接受它! – Cascabel 2010-11-07 22:11:56
謝謝,就是這樣。 RuleDelayed而不是Rule。 – 2010-11-07 22:15:09