记录的值打印与脚本执行中的值不匹配您好,我想了解使用默认本地范围的函数中的一些行为。 即,使用 Print 语句时出现在我的日志中的值与执行我的代码的值不匹配。 例如在这个脚本中:
Names Default To Here( 1 );
EXAMPLE_VALUE = "100";
showExampleModal = Function( {},
{Default Local},
Print("Here:EXAMPLE_VALUE: " || Char(Here:EXAMPLE_VALUE));
Print("EXAMPLE_VALUE: " || Char(EXAMPLE_VALUE));
modal = New Window( "Example Modal",
<<MODAL></MODAL>在我的日志中,我看到:
"Here:EXAMPLE_VALUE: 100"
"EXAMPLE_VALUE: 100"
但是在我的模态中我看到:
Here:EXAMPLE_VALUE: 100
EXAMPLE_VALUE: .
脚本回复:打印中记录的值与脚本执行中的值不匹配@垫滑雪,当在函数中声明 Default Local 命名空间时,所有未定义范围的变量都是该函数的局部变量(请参阅这里). EXAMPLE_VALUE 是在函数外部声明的,因此模态仅在变量引用的范围限定为 Here 时才显示正确的值。 在函数内声明 EXAMPLE_VALUE 将使它成为本地的并可供函数使用,但它不会存在于 Here 命名空间中以供脚本的其余部分访问。 这是一个有关命名空间引用的有用页面.
回复:打印中记录的值与脚本执行中的值不匹配根据您链接到名称空间引用的文档,它指出对于具有默认本地的用户定义函数“参考规则不变”,不合格参考的参考规则规定:
如果名字默认到这里模式打开时,JMP 在以下位置查找变量:
因此,似乎文档说明它仍然应该回退到 Here 以防在 Local 命名空间中没有具有相关名称的局部变量。
另外,对我来说,Print 语句的行为与 Print 产生的上下文的行为不匹配似乎是有问题的。
回复:打印中记录的值与脚本执行中的值不匹配在处理 JSL 中的范围时。 如果你在它们之间移动,我几乎总是说要明确。我花了 DAYS 尝试调试单个范围界定问题。
回复:打印中记录的值与脚本执行中的值不匹配基于一些进一步的调试,我相信我明白发生了什么。
更新代码:
Names Default To Here( 1 );
EXAMPLE_VALUE = "100";
showExampleModal = Function( {},
{Default Local},
// (1)
hereStr = "Here:EXAMPLE_VALUE: " || Char( Here:EXAMPLE_VALUE );
unqualifiedStr = "EXAMPLE_VALUE: " || Char( EXAMPLE_VALUE );
// (2)
hereStrTextBox = Text Box( "Here:EXAMPLE_VALUE: " || Char( Here:EXAMPLE_VALUE ) );
unqualifiedStrTextBox = Text Box( "EXAMPLE_VALUE: " || Char( EXAMPLE_VALUE ) );
// (3)
Print( hereStr );
Print( unqualifiedStr );
modal = New Window( "Example Modal",
<<MODAL></MODAL>
在 (1) 处,分配会立即进行评估,因此当它们稍后传递到打印/文本框时,它们会按照我的预期进行定义。 (3) 的输出和 (4) 的第一个文本框证实了这一点。
在 (2) 处,文本框在执行该行时再次被评估,因此当它们被显示时,它们再次使用我期望的值定义。 (4) 的最后两个文本框证实了这一点
(4) 的中间两个文本框实际上并没有立即求值,而是作为表达式传递给中心框(或者可能是列表框?),稍后/在另一个范围内求值(我猜是列表框的范围或中心框)。 结果,EXAMPLE_VALUE 的值不是我所期望的,而是 EXAMPLE_VALUE 在任何其他范围内被评估的值(即它是未定义的)。
这似乎已被 (5) 证实,它也将 Prints 作为表达式传递给稍后/在另一个范围内进行评估。
这是准确的吗?
回复:打印中记录的值与脚本执行中的值不匹配盒子有自己的范围。目前你正在做一个模态窗口,但想象一下如果你不是并且函数关闭并且所有局部变量现在都消失了。对于这样的事情,我通常会做类似的事情。
Names default to here(1);
test = function({something_passed, kwargs={}},
{DEFAULT LOCAL},
// Kwargs
kwarg = Try(kwargs["kwarg"], "default"); // kwarg description
something_not_passed = 14;
nw = new window("Scope",
window:something_not_passed = something_not_passed; // just assignthe variable to the display
window:something_passed = something_passed;
window:something_direct = 42;
buttonbox("OK",
<<SET function=""></SET>