1

C# .dll を使用してハッシュを取得する Ironruby で記述されたスクリプトがあります。次に、残りの Ruby コード全体でそのハッシュを使用します。Ironruby インタープリターからスクリプト全体を実行したくありません。IRインタープリターでコードの一部を実行し、ハッシュを取得し、通常のRubyインタープリターを介して残りのコードを実行する方法はありますか?

ありがとう

4

1 に答える 1

1

考えられる解決策の 1 つは、スクリプトを 2 つの部分に分割することです。iron ruby​​ によって実行される最初の部分は、ruby によって実行される 2 番目の部分に制御を渡す前に、状態を 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

ここに ruby​​ 1.8 の 2 番目の部分のコード (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%

並行環境でスクリプトを実行すると、ironruby スクリプトで yaml ファイルの一意の一時的な名前を生成して、2 つのプロセス (またはスレッド) が同じファイルを書き込もうとすることを回避できます。

必要に応じて、.bat の代わりに C# のコード行を使用して、スクリプトの 2 つの部分を統合することもできますが、これは少し難しいです (IMHO)。

以下を使用して、このソリューションを正常にテストしました。

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]

説明が必要かどうか尋ねる

于 2012-05-25T18:55:55.307 に答える