2012-05-24 2 views
1

У меня есть сценарий, написанный в Ironruby, который использует C# .dll для извлечения хэша. Затем я использую этот хэш на протяжении всего моего кода Ruby. Я бы предпочел не запускать весь свой сценарий у переводчика Ironruby. Нужно ли в любом случае запустить часть кода в интерпретаторе IR, получить хэш и выполнить остальную часть кода через обычный интерпретатор Ruby?Запуск двух разных интерпретаторов на одном скрипте

Благодаря

+2

Рассматривали ли вы с помощью двух сценариев и обжигающе хэш от IronRuby один в ИК один? –

+0

трубопровод ... я хотел бы знать, как я мог это сделать. Есть документация в любом месте? – Wadstk

+0

['Open3'] (http://ruby-doc.org/stdlib-1.9.3/libdoc/open3/rdoc/Open3.html) был бы самым надежным способом. –

ответ

0

Одним из возможных решений является разделить сценарий на две части, первая часть казненных железной рубин должен сохранить свое состояние в файле YAML перед передачей управления второй части, которая будет работать на рубин

здесь небольшая демонстрация:

C:\devkit\home\demo>demo 
"running program:demo_ir.rb" 
"the first part of the script running by the iron_ruby interpreter" 
"my_hash attributes:" 
"attr1: first value" 
"attr2: second value" 
"attr3: 2012" 
"hash_store_filename:temp.yaml" 
"running program:demo_ruby.rb" 
"hash_store_filename:temp.yaml" 
"the second part of the script running by ruby 1.8.x interpreter" 
"my_hash attributes:" 
"attr1: first value" 
"attr2: second value" 
"attr3: 2012" 

здесь источник первой части для IronRuby (demo_ir.rb):

require "yaml" 
p "running program:#{$0}" 
hash_store_filename = ARGV[0] 

my_hash = { attr1: 'first value', attr2: 'second value', attr3: 2012} 

p "the first part of the script running by the iron_ruby interpreter" 
p "my_hash attributes:" 
p "attr1: #{my_hash[:attr1]}" 
p "attr2: #{my_hash[:attr2]}" 
p "attr3: #{my_hash[:attr3]}" 

# save the state of the script in an array where my_hash is the first element 
p "hash_store_filename:#{hash_store_filename}" 
File.open(hash_store_filename, 'w') do |out| 
    YAML.dump([my_hash], out) 
end 

здесь код второй части для рубинового 1.8 (demo_ruby.rb)

require "yaml" 
p "running program:#{$0}" 
hash_store_filename = ARGV[0] 
p "hash_store_filename:#{hash_store_filename}" 
ar = YAML.load_file(hash_store_filename) 
my_hash=ar[0] 

p "the second part of the script running by ruby 1.8.x interpreter" 
p "my_hash attributes:" 
p "attr1: #{my_hash[:attr1]}" 
p "attr2: #{my_hash[:attr2]}" 
p "attr3: #{my_hash[:attr3]}" 

и пусковую:

@ECHO OFF 
REM file: demo.bat 
SET TEMP_YAML=temp.yaml 
ir demo_ir.rb %TEMP_YAML% 
ruby demo_ruby.rb %TEMP_YAML% 
del %TEMP_YAML% 

при запуске сценария в параллельной среде вы можете создать уникальное временное имя файла yaml в скрипте ironruby, избегая того, что два процесса (или потока) пытаются записать один и тот же файл.

При желании вы могли бы использовать некоторые C# строка кода, вместо .bat, чтобы объединить две части сценария, но это немного сложнее (ИМХО)

Я успешно испытание это решение с помощью:

C:\devkit\home\demo>ir -v 
IronRuby 1.1.3.0 on .NET 4.0.30319.239 

C:\devkit\home\demo>ruby -v 
ruby 1.8.7 (2011-12-28 patchlevel 357) [i386-mingw32] 

спросить, если вам нужны разъяснения

Смежные вопросы