以下代码在笔记本中进行评估时有效:
Person[name_String, age_Integer] := {name, age};
Person["Jane", 30]
name = "Dick";
age = 28;
Person[name, age]
输出
{"Jane", 30}
{"Dick", 28}
所以我把它放在以下包中:
BeginPackage["Person`"]
Unprotect @@ Names["Person`*"];
ClearAll @@ Names["Person`*"];
Person[name_String, age_Integer] := {name, age};
Protect @@ Names["Person`*"];
EndPackage[]
Needs["Person`"];
Person["Jane", 30]
name = "Dick";
age = 28;
Person[name, age]
name1 = "Bill";
age1 = 40;
Person[name1, age1]
{"Jane", 30}
Set::wrsym: Symbol name is Protected. >>
Set::wrsym: Symbol age is Protected. >>
Person[name, age]
{"Bill", 40}
我不明白为什么使用符号名称和年龄会出现保护问题。人的论点“名称”和“年龄”也受到保护吗?
celtschk的回答让我看到了光明。以下内容未公开姓名和年龄:
BeginPackage["Person`"]
Unprotect @@ Names["Person`*"];
ClearAll @@ Names["Person`*"];
Person::usage = "Person";
Begin["`Private`"]
Person[name_String, age_Integer] := {name, age};
End[]
Protect @@ Names["Person`*"];
EndPackage[]
答案 0 :(得分:4)
因为当您定义函数Person
时,当前上下文为Person`
,所有新标识符都在那里创建,甚至标识符name
和{{ 1}}(之前没有创建它们,因此它们是在那时创建的)。之后,您将保护上下文age
中的所有内容,包括这两个符号。当您尝试分配给他们时,Mathematica正确地抱怨他们受到保护。