jruby 1.7.23 (1.9.3p551) 2015-11-24 f496dd5 su Java HotSpot (TM) Server VM a 64 bit 1.7.0_79-b15 + jit [ Windows 7-amd64]Accesso a una variabile dall'ambiente di script di JRuby di primo livello da Java
ho eseguito uno scriptlet nel mio contenitore di scripting come questo:
(RubyObject) ro = (RubyObject)container.runScriptlet(org.jruby.embed.PathType.RELATIVE,"example.rb");
dove container
è di tipo ScriptingContainer. Il "comportamento delle variabili locali" è impostato su "transitorio".
Il file example.rb contiene le seguenti righe:
foo='xxx'
$bar='yyy'
'zzz'
posso recuperare dal lato Java il valore 'zzz', perché è esplicitamente tornato da runScriptlet. Posso anche recuperare il valore di $ bar usando
container.get("$bar")
C'è un modo per recuperare il valore di foo? container.get("foo")
restituisce il puntatore nullo.
Ho anche provato a cambiare il comportamento della variabile locale in "persistente", ma sempre lo stesso risultato.
No, come ho scritto, ho impostato il comportamento della variabile locale su TRANSIENT. Non voglio mantenere variabili locali e non ho bisogno di accedere alle variabili locali memorizzate nel contenitore di scripting. Forse la mia comprensione di transitori contro persistenti è difettosa. Dalla mia comprensione, persistente si applica alle variabili locali all'interno delle funzioni. Dalla tua risposta, sembra che si applichi anche alle variabili nell'ambiente di livello superiore della sceneggiatura. Se questo è il caso, capisco, perché non è possibile accedere alla mia variabile 'pippo'. – user1934428
Vedo che devo chiarire qualcosa (non mi è stato chiaro che questo è un punto importante, ma apparentemente lo è): il mio script viene eseguito solo una volta. L'unico scopo di questa esecuzione è creare diversi oggetti Ruby, a cui si accede dal mio codice Java. Il codice Java memorizza i riferimenti a questi oggetti Ruby e li usa nel sequel come se fossero semplici oggetti Java. Naturalmente mi assicuro che rimanga vivo un riferimento allo ScriptingComtainer, per evitare che possa raccogliere i rifiuti, e non sono sicuro di quale effetto ciò avrebbe sui miei oggetti Ruby .... – user1934428