2016-01-11 22 views
10

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.

risposta

0

Penso che tu abbia già utilizzato questo ScriptingContainer (LocalVariableBehavior.PERSISTENT) ma ciò che è necessario significa che puoi già accedere alla maggior parte di ciò che è all'interno di questo scriptContainer.

Forse, possiamo modificare un po 'il tuo codice e provare a usare parse. Si prega di vedere example 4. Potrebbe illuminarti. Spero che questo ti aiuti.

+0

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

+0

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