西蒙的方法的细微变化是在函数使用一个默认值,而不是一个全局变量($Center
)。
假设你的默认原点是(5,5),则:
myNorm[pos:{_, _}, center_:{5, 5}] := EuclideanDistance[pos, center]
注意使用_:{5, 5}
定义默认值。
现在你可以这样做:
myNorm[{5, 7}]
(* Out[]= 2 *)
或临时使用不同的中心与:
myNorm[{5, 7}, {8, 8}]
(* Out[]= Sqrt[10] *)
对于这个简单的功能,你可以在第二种情况下使用EuclideanDistance
代替,但我希望你可以看到这种方法的效用是更复杂的定义myNorm
。
该方法的缺点是不能轻易更改默认中心。
这的确让人们轻易地更改默认的中心,但更详细的另一个变化,是使用Options
:
Options[myNorm2] = {Center -> {5, 5}};
myNorm2[pos : {_, _}, OptionsPattern[]] :=
EuclideanDistance[pos, OptionValue[Center]]
语法是:
myNorm2[{5, 7}]
myNorm2[{5, 7}, Center -> {8, 8}]
2
Sqrt[10]
更改默认的c输入:
SetOptions[myNorm2, Center -> {8, 8}];
myNorm2[{5, 7}]
Sqrt[10]
@ 500不用客气。请参阅我的更新的答案另一种方法。 – 2011-06-12 22:46:28
我在第一个版本中用'Default'完成了同样的错误。在我注意到我刚才在顶部发表评论时说:“如果更改$ xyz,则需要重新定义以下内容......”! – Simon 2011-06-13 23:01:18
@Simon如果它有我们两个,我会发布一个关于这个问题。 “DefaultValues [f]”没有效果而改变的事实令人困惑。 – 2011-06-13 23:45:29