我发现有时能够使用自己的本地符号创建一个本地模块(在父模块内)很有用,这只需要父模块使用一个小任务。当模块变大时,这很有用,并且没有充分的理由在模块外部创建较小的辅助函数,因为这些辅助函数确实只需要由一个父模块使用和使用。
这是一个愚蠢的例子,里面有一个模块,里面有一个辅助模块
foo[x_] := Module[{r},
r = Module[{y, sol},
sol = First@Solve[y^2 + 3 y + 2 == 0];
y /. sol
];
x^r
]
但是上面的问题是,内部模块的局部变量,可能与父模块的局部变量冲突,因为当我做以下操作时M笔记本使内部模块局部变量变红,这告诉我我正在做一些我不应该做的事情:(我不想一直担心我是否在使用内部模块的唯一本地符号,这与用作父模块的本地符号的符号不同,毕竟,它应该是本地的。并且在这种情况下也必须提出不同的符号名称)
foo[x_] := Module[{r, y=0},
r = Module[{y, sol},
sol = First@Solve[y^2 + 3 y + 2 == 0];
y /. sol
];
x^r
]
注意红色,根据帮助,它是多个上下文中的局部范围冲突或阴影。
(M需要使用更好的颜色,难以在许多颜色之间产生差异,所有颜色都是红色)。
(我认为这是一个阴影警告)无论哪种方式,它告诉我我不应该这样做,即使我在使用它时没有看到这种构造有任何问题。
本例中父模块局部变量'y'的值没有通过调用内部模块'r'而被覆盖,这是好的。
同样,我不想在foo之外创建一个函数,因为这个小任务仅由foo []使用,不需要将它移动到Global上下文。
当然,我总是可以写:
foo[x_] := Module[{r, y, sol},
sol = First@Solve[y^2 + 3 y + 2 == 0];
r = y /. sol;
x^r
]
但我只是举个例子,这是针对大型模块的,它有助于将模块内部的任务分解为甚至几个较小的任务。内部函数,内部函数是我之前在其他语言中使用的东西,例如Ada / Pascal,它具有这种结构,可用于大型程序。
我的问题是:只是想与专家联系,如果我可以安全使用上述内容,即使M给我这个红色警告?如果有什么我需要担心这样做
感谢,
答案 0 :(得分:8)
是的,只要您不丢失它们,就可以安全地在嵌套Modules
中使用相同的变量。 Mathematica将Module
中定义的每个变量视为该模块的本地变量。局部变量为Temporary
,编号为variable$ModuleNumber
。您可以使用以下示例自行检查:
Module[{x = 1},
Print[HoldForm@x, " = ", x]
Module[{x = 2},
Print[HoldForm@x, " = ", x]
Module[{x = 3},
Print[HoldForm@x, " = ", x]
];
Print[HoldForm@x, " = ", x]
];
Print[HoldForm@x, " = ", x]
]
(*Output
x$4576 = 1
x$4577 = 2
x$4578 = 3
x$4577 = 2
x$4576 = 1
*)
答案 1 :(得分:2)
据我所知,这是检测的一个小问题。