2010-11-07 79 views
1

顯然這些模式變量不像我所預期的那樣工作。這裏有一個簡單的例子:爲什麼這個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" 

感謝,
羅布

回答

4

發生替換前規則的右手邊正在接受評估,所以你需要使用RuleDelayed:>),而不是Rule->):

In[1]:= 1 /. x_ :> {x, f[x], ToString[x]} 

Out[1]= {1, f[1], "1"} 

RuleRuleDelayed類似於Set=)和SetDelayed:=)。

HTH!

3

嘗試Trace[1 /. x_ -> {x, f[x], ToString[x]}]。我目前無法訪問mathematica,但我相信您會看到替換項(特別是ToString[x])在應用之前評估爲,因此您正在執行1 /. x_ -> {x, f[x], "x"}

+3

對,你想使用'RuleDelayed',也就是':>'而不是' - >'('Rule')。 – 2010-11-07 21:23:14

+0

@Michael:你應該把它作爲一個單獨的答案發布,所以我可以放棄它,OP可以接受它! – Cascabel 2010-11-07 22:11:56

+0

謝謝,就是這樣。 RuleDelayed而不是Rule。 – 2010-11-07 22:15:09

相關問題