2016-01-11 30 views
10

jruby 1.7.23 (1.9.3p551) 2015-11-24 f496dd5 na 64-bitowym serwerze Java HotSpot (TM) 1.7.0_79-b15 + jit [ Windows 7-amd64]Uzyskiwanie dostępu do zmiennej dotyczącej środowiska JRuby najwyższego poziomu w środowisku Java:

biegnę scriptlet w moim skryptów kontenera tak:

(RubyObject) ro = (RubyObject)container.runScriptlet(org.jruby.embed.PathType.RELATIVE,"example.rb"); 

gdzie container jest typu ScriptingContainer. "Zachowanie zmiennej lokalnej" jest ustawione na "przejściowe".

Plik example.rb zawiera następujące wiersze:

foo='xxx' 
$bar='yyy' 
'zzz' 

można pobrać ze strony Java wartość „ZZZ”, ponieważ jest wyraźnie zwrócony z runScriptlet. Mogę również pobrać wartość $ bar, używając

container.get("$bar") 

Czy istnieje sposób na odzyskanie wartości foo? container.get("foo") zwraca wskaźnik zerowy.

Próbowałem również zmienić zachowanie zmiennej lokalnej na "trwały", ale wciąż taki sam wynik.

Odpowiedz

0

Myślę, że już użyłeś tego ScriptingContainer (LocalVariableBehavior.PERSISTENT), ale to konieczne oznacza, że ​​możesz już uzyskać dostęp do większości elementów znajdujących się w tym skrypcieContainer.

Może, możemy nieco zmodyfikować twój kod i spróbować użyć parsowania. Patrz: example 4. Może cię oświecić. Mam nadzieję że to pomoże.

+0

Nie, jak napisałem, ustawiam zmienne zachowanie lokalne na TRANSIENT. Nie chcę przechowywać zmiennych lokalnych i nie potrzebuję dostępu do zmiennych lokalnych przechowywanych w kontenerze skryptów. Być może moje rozumienie przemijającego lub uporczywego jest wadliwe. Z mojego rozumowania persistent odnosi się do zmiennych lokalnych w funkcjach. Z Twojej odpowiedzi wynika, że ​​dotyczy to również zmiennych w środowisku środowiska skryptowego. W takim przypadku rozumiem, dlaczego nie można uzyskać dostępu do mojej zmiennej 'foo'. – user1934428

+0

Widzę, że muszę coś wyjaśnić (nie było dla mnie jasne, że jest to ważna kwestia, ale na pozór tak jest): Mój skrypt uruchamiany jest tylko raz. Jedynym celem tego uruchomienia jest utworzenie kilku obiektów Ruby, które są następnie dostępne z mojego kodu Java. Kod Java przechowuje odwołania do tych obiektów Ruby i używa ich w kontynuacji tak, jakby były zwykłymi obiektami Java. Oczywiście zapewniam, że zawsze istnieje odnośnik do ScriptingComtainer, który pozostanie przy życiu, aby nie doszło do zebrania śmieci i nie jestem pewien, jaki wpływ na moje Ruby Objects miałby ... – user1934428