記錄的值打印與腳本執行中的值不匹配您好,我想了解使用默認本地範圍的函數中的一些行為。 即,使用 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>