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.
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
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