使用输入来确定要调用的数组

时间:2017-04-19 21:50:19

标签: arrays ruby

我仍然掌握了Ruby的基础知识,并完成了重建河内之塔的任务。我真的想缩小我的代码,但为此,我需要根据用户输入调用特定的数组。例如:

 Stack_1=[5,4,3] 
 Stack_2=[5,2,1] 
 Stack_3=[5]

 puts "Please select a tower" 
 tower_select=gets.chomp.to_i
 puts "Please select where you'd like to move" 
 tower_move=gets.chomp.to_i

 if Stack_{tower_select}[-1] < Stack_{tower_move}[-1]   
   Stack_{tower_move} << Stack_{tower_select}[-1]   
   Stack_{tower_select}.delete_at(-1) 
 else puts "ERROR: Invalid move"
 end

这可能吗?

2 个答案:

答案 0 :(得分:1)

将您的堆栈放在数组或哈希中,一切都变得更容易。这使用了哈希(它们起初看起来很可怕,但处理起来很轻松):

// in hapijs, for example:

handler(request, reply) {
   if (isAuthenticated(request)) {
     reply.view('dashboard')
   } else {
     reply.view('static_page')
   }
}

答案 1 :(得分:1)

是的,使用Ruby的反射方法可以

 if const_get(:"Stack_#{tower_select}")[-1] < const_get(:"Stack_#{tower_move}")[-1]   
   const_get(:"Stack_#{tower_move}") << const_get(:"Stack_#{tower_select}")[-1]   
   const_get(:"Stack_#{tower_select}").delete_at(-1) 
 else
   puts 'ERROR: Invalid move'
 end

但你不想这样做。认真。别。只是......不要。

每当你觉得需要有变量(或者在这种情况下常量,但没关系),如foo_1foo_2之类的,等等。更好的解决方案。你知道,Ruby已经有了一个数据结构,你可以把它放到你想要通过索引访问的内容中。它们被称为数组,您已经了解它们,因为您已经在代码中实际使用它们了:

stacks = [[5, 4, 3], [5, 2, 1], [5]]

puts 'Please select a tower'
tower_select = gets.to_i - 1 # somehow, "normal" humans count from 1 …
puts "Please select where you'd like to move" 
tower_move = gets.to_i - 1

if stacks[tower_select].last < stacks[tower_move].last   
  stacks[tower_move] << stacks[tower_select].pop   
else
  puts 'ERROR: Invalid move'
end

[您可能会注意到我在其中添加了一些其他修补程序。你的代码没有错,但这更加惯用。]