我仍然掌握了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
这可能吗?
答案 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_1
,foo_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
[您可能会注意到我在其中添加了一些其他修补程序。你的代码没有错,但这更加惯用。]