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

您也可以将 lambda 用于此类任务:

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

您已经有了一些使用 lambdas 的答案(这是正确的答案)。

我想存储 ruby​​ 命令并在以后执行它们。

如果后者在脚本的末尾,您可以使用END

END {
  puts 1
}
puts 2

结果:

2
1    
于 2012-08-03T11:35:06.477 回答
0

就更好的变量范围可见性而言,我建议使用。但是如果你只想存储和执行,lambda是一个完美的解决方案。

据我了解,我猜您想在 command_store 之外的某个地方访问 my_first_array。因此,在您的情况下,它将是:

场景一:如果您不想公开 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

场景二:假设您希望赋值语句对外部变量有效。在这种情况下考虑使用绑定也是一个好主意。

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 回答