gpt4 book ai didi

package - 在数学包中定义私有(private)函数

转载 作者:行者123 更新时间:2023-12-04 17:04:49 24 4
gpt4 key购买 nike

我不确定我是否知道如何正确定义私有(private)函数。
当我写一个包mathematica时,我只是这样做:

BeginPackage["myPackage`"]
myPublicFunction::usage="myPublicFunction blahblahblah";
Begin["Private"]
myPrivateFunction[input_]:= ... ;
myPublicFunction[input_]:= ... ;
End[]
EndPackage[]

这是正确的方法还是我错过了什么?

最佳答案

是的,这是正确的方法。了解一些内部包机制可能会有所收获。 Mathematica 上下文类似于其他语言中的 namespace 。它们可以嵌套。每个符号都属于某个上下文。在任何给定时刻,某些上下文是“当前的”。每当创建一个新符号时,系统必须决定该符号属于哪个上下文。这发生在解析时。这里的基本量(变量)是$ContextPath .它基本上是符号的搜索路径。它是一个上下文列表,每当系统看到一个新符号时,它都会测试 $ContextPath 上的某个上下文中是否存在具有相同短名称(即,符号本身的名称,没有上下文)的符号。 .如果它确实存在,那么给定的符号将与现有的符号相关联。如果不是,则在当前上下文中创建符号。请注意,这是动态的 - 如果您更改 $ContextPath在任何时候,下一个符号出现都可以与不同的符号相关联。

无论如何,BeginPackage所做的是它只是将 $ContextPath 的当前值替换为 {youPublicPackageContext, "System'"} ,加上可能通过 BeginPackage 的第二个可选参数公开导入的其他上下文.因此,“公共(public)”部分中的所有符号都将被解析到公共(public)上下文中,如果它们不在“系统”或您导入的其他上下文中。还有什么EndPackage做的是恢复$ContextPath的值到你开始加载包之前的状态。因此,从技术上讲,使用消息并不是在主要上下文中公开符号的唯一方法 - 您也可以简单地键入带有分号的符号,例如 myFunction; (不鼓励这种做法,我只是为了澄清机制而提到它)。现在,当您输入 Begin["'Private'"] 时会发生什么?是当前上下文变为YourContext'Private' (一个子上下文)。 $ContextPath没有改变。因此,在那里输入的任何符号,在您的公共(public)包或其他导入的包中不存在(即当前在 $ContextPath 上的上下文),会自动被解析为 'Private'。子上下文。

真正使这些符号私有(private)的是,每当您将包导入其他上下文(包)时,只有主包被添加到 $ContextPath。 ,但不是它的子包。从技术上讲,您可以通过手动添加 YourPackage'Private' 来破坏封装。到 $ContextPath (例如 PrependTo[$ContextPath, YourPackage'Private'] ),然后您的所有私有(private)函数和其他符号将在您执行导入的特定上下文中公开。同样,不鼓励这种做法,但它解释了机制。底线是,当我们知道符号是如何解析的以及 $ContextPath 的操作是什么时,可以完全理解私有(private)或公共(public)的概念。和 $Context (另一个系统变量,给出当前上下文的值),由 Begin 等命令执行和 BeginPackage .换句话说,原则上可以模仿 BeginPackage 的行为。 , Begin , EndEndPackage使用用户定义的代码。这里只有几个原则(我试图在上面概述),而且机制本身实际上是非常暴露给用户的,所以如果在极少数情况下,一个人可能想要一些其他行为,一个人可以做出$ContextPath 的一些“自定义”操作和 Context , 以确保符号解析的一些非标准方式,因此,以一些“非标准”方式控制包规模封装。我不鼓励这样做,只是强调该机制实际上比表面上看起来要简单得多,可控得多。

关于package - 在数学包中定义私有(private)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5135510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com