Valori registrati Stampa valori non corrispondenti nelle esecuzioni degli scriptCiao, sto cercando di capire alcuni comportamenti in una funzione che utilizza l'ambito locale predefinito. Vale a dire, i valori che appaiono nei miei log quando si utilizzano le istruzioni Print non corrispondono ai valori con cui viene eseguito il mio codice. Ad esempio in questo script:
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>Nei miei log vedo:
"Here:EXAMPLE_VALUE: 100"
"EXAMPLE_VALUE: 100"
Tuttavia nel mio modale vedo:
Here:EXAMPLE_VALUE: 100
EXAMPLE_VALUE: .
ScriptingRi: Valori registrati Stampa valori non corrispondenti nelle esecuzioni degli script@mat-ski , quando si dichiara lo spazio dei nomi locale predefinito in una funzione, tutte le variabili senza ambito sono locali a quella funzione (vedere Qui ). EXAMPLE_VALUE è dichiarato all'esterno della funzione, quindi il modale visualizza il valore corretto solo quando il riferimento alla variabile ha come ambito Here. Dichiarare EXAMPLE_VALUE all'interno della funzione lo renderà locale e disponibile per la funzione, ma non esisterebbe nello spazio dei nomi Here per essere accessibile al resto dello script. Ecco un pagina utile sul riferimento allo spazio dei nomi .
Ri: Valori registrati Stampa valori non corrispondenti nelle esecuzioni degli scriptSecondo la documentazione che hai collegato al riferimento allo spazio dei nomi, si afferma che per le funzioni definite dall'utente con Default Local " la regola di riferimento è invariata" e la regola di riferimento per i riferimenti non qualificati afferma:
Se la I nomi predefiniti sono qui la modalità è attiva, JMP cerca la variabile in queste posizioni:
- Locale spazio dei nomi
- Qui spazio dei nomi
- tabella dati corrente
Quindi sembra che la documentazione affermi che dovrebbe comunque ricorrere a Here nel caso in cui non ci siano variabili locali con il nome in questione nello spazio dei nomi Local.
Separatamente, mi sembra problematico che il comportamento dell'istruzione Print non corrisponda al comportamento del contesto da cui viene creata la stampa.
Ri: Valori registrati Stampa valori non corrispondenti nelle esecuzioni degli scriptQuando si ha a che fare con gli ambiti in JSL. Dico praticamente sempre di essere esplicito se ti muovi tra loro.Ho trascorso GIORNI cercando di eseguire il debug di un singolo problema di ambito.
Ri: Valori registrati Stampa valori non corrispondenti nelle esecuzioni degli scriptSulla base di alcuni ulteriori debug, credo di aver capito cosa sta succedendo.
Codice aggiornato:
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>
In (1) le assegnazioni vengono valutate immediatamente e quindi quando vengono passate successivamente alla casella di stampa/testo vengono definite come mi aspetto. Ciò è confermato dall'output di (3) e dal primo alle caselle di testo di (4).
In (2) le caselle di testo vengono nuovamente valutate nel momento in cui la riga viene eseguita, quindi quando vengono visualizzate, vengono nuovamente definite utilizzando i valori che mi aspetto. Ciò è confermato dalle ultime due caselle di testo di (4)
Le due caselle di testo centrali di (4) non vengono infatti valutate immediatamente, ma passate alla casella centrale (o forse alla casella di riepilogo?) come espressioni e valutate successivamente/in un altro ambito (immagino che l'ambito della casella di riepilogo o la casella centrale). Di conseguenza, il valore di EXAMPLE_VALUE non è quello che mi aspettavo, invece è il valore di EXAMPLE_VALUE in qualsiasi altro ambito in cui viene valutato (ovvero non è definito).
Ciò sembra essere confermato da (5), che passa anche le stampe come espressioni da valutare successivamente / in un altro ambito.
È accurato?
Ri: Valori registrati Stampa valori non corrispondenti nelle esecuzioni degli scriptle scatole hanno il loro scopo. attualmente stai creando una finestra modale, ma immagina se non lo fossi e la funzione fosse chiusa e tutte le variabili locali fossero sparite.Per cose del genere di solito faccio qualcosa del genere.
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>