2

デフォルト値を設定した変数があり、それに対して手順を実行します。問題は、ブロックには独自の変数スコープがあり、外部へのアクセスがないため、ブロック内の変数にアクセスできないことです。ここにスニペットがあります:

value = ""
cmd_errors = Array.new

# Call the command line
status = POpen4.popen4(cmd) do |stdout, stderr|
  output = stdout.read
  error  = stderr.read
  if (!output.empty?)
    value = JSON.parse(output)      #This just creates a block scoped variable called 'value' and my local variable is still empty
  else
    cmd_errors << error
  end
end

ブロックがそのローカル変数に書き込むことを許可することは可能ですか? おそらく参照を使用していますか?

4

1 に答える 1

2

プログラムでは、外部value変数ブロックによって変更されています。このような外部変数に割り当てるのが通常nilですが、あなたが持っているものはうまくいきます。

このように、値をブロック内の別の値に変更してみてください。変数が変更されていることがわかります。私の推測では、それoutput.empty?は真実になりつつあります。

value = nil
cmd_errors = Array.new

status = POpen4.popen4(cmd) do |stdout, stderr|
  output = stdout.read
  error  = stderr.read
  value = 'within block'
  if (!output.empty?)
    value = JSON.parse(output)
  else
    cmd_errors << error
  end
end

p value
于 2013-07-17T21:11:48.203 に答える