1

別の問題の回避策として、少し変わったことをしようとしています。ruby コマンドを保存して後で実行したい。

コマンドを変数に保存することはできますが、画面に出力することしかできません。 flatten をいじって、どうにかしてそれらを使用可能な形式に変換できるかどうかを確認しましたが、機能しませんでした。

次に例を示します。

Command_Store = Array[puts "Hello World", my_first_array = array.new, puts "Hello World again"]

execute.Command_Store[0] => Hello World 
execute.Command_Store[1] => my.first_array[] 
execute.Command_Store[2] => Hello World again
4

4 に答える 4

8

また、この種のタスクにラムダを使用できます。

command_store = []
command_store << lambda { puts "Hello World" }
command_store << lambda { my_first_array = Array.new }
command_store << lambda { puts "Hello World again" }

command_store.each(&:call) 
#=> Hello World
#=> Hello World again

アップデート:

変数をキャプチャできますmy_first_array。これがクロージャーと呼ばれるものです

my_first_array = [3,4,5,6,7]

command_store << lambda { puts my_first_array[0] }

command_store.each(&:call)
#=> ...
#=> 3
于 2012-08-03T09:09:56.270 に答える
5

標準関数eval()を使用しないのはなぜですか?

例(リンクされた記事から)

code = "Time.now"
result = eval(code)
puts result
于 2012-08-03T08:57:01.040 に答える
1

ラムダを使用するための回答が既にあります (これが正解です)。

ruby コマンドを保存して後で実行したい。

後者がスクリプトの最後にある場合は、次を使用できますEND

END {
  puts 1
}
puts 2

結果:

2
1    
于 2012-08-03T11:35:06.477 に答える
0

変数のスコープ可視性を向上させるという点では、ブロックを使用することをお勧めします。ただし、ラムダは、保存して実行するだけの場合に最適なソリューションです。

私の理解では、command_store の外のどこかで my_first_array にアクセスしたいと思います。したがって、あなたの場合は次のようになります。

シナリオ I : my_first_array を公開したくないが、何らかの方法でそれを試してみたい場合。

def command_store
  puts 'Hello World'
  # here my_first_array is just a local variable inside command_store
  my_first_array = Array.new(5) {|i| Random.rand(100)}
  yield(my_first_array)
  puts 'Hello World again'
end

command_store() do |x|
  # puts '**Call from outside'
  puts "The first element is #{x[0]}"
  # ...
  puts "The last element is #{x[-1]}"
  # puts '**Call from outside again'
end

# Output:
# => Hello World
# => The first element is 41
# => The last element is 76
# => Hello World again

シナリオ II : 割り当てステートメントを外部変数に対して有効にしたいとします。この場合にバインディングを使用することを検討することもお勧めします。

def command_store(var=[])
  puts 'Hello World'
  # here my_first_array is just a local variable inside command_store
  my_first_array = Array.new(5) {|i| Random.rand(100)}
  var.replace(my_first_array)
  puts 'Hello World again'
  return var
end

a = Array.new
command_store(a)
puts a[0]

b = command_store()
puts b[0]

# Output:
# => Hello World
# => Hello World again
# => 66
# => Hello World
# => Hello World again
# => 16
于 2012-08-03T11:26:11.937 に答える