Ruby 动态';案例'';何时';条件
下面的函数遍历一个数组Ruby 动态';案例'';何时';条件,ruby,dynamic-programming,Ruby,Dynamic Programming,下面的函数遍历一个数组MASTER\u INVENTORY,并显示要购买的选项。键入1购买项目1,键入2购买项目2,键入34购买项目34 def buy_menu() choices = ['Go [B]ack'] i = 1 MASTER_INVENTORY.each do |obj| choices << "[#{i}] Buy #{obj.name} Price: #{obj.price}" i += 1 end choicemap = c
MASTER\u INVENTORY
,并显示要购买的选项。键入1
购买项目1
,键入2
购买项目2
,键入34
购买项目34
def buy_menu()
choices = ['Go [B]ack']
i = 1
MASTER_INVENTORY.each do |obj|
choices << "[#{i}] Buy #{obj.name} Price: #{obj.price}"
i += 1
end
choicemap = choices.map { |c| " #{c}\n" }.join
puts choicemap
input = gets.chomp
case input
when "b","B"
main_menu
when "1"
buy_item_index(1)
buy_menu
when "2"
buy_item_index(2)
buy_menu
when ...
...
else
puts "Not a valid input"
buy_menu
end
end
def购买菜单()
选项=['Go[B]ack']
i=1
主库存。每个都有
选择
在Ruby中有很多方法可以做事情。这是一个解决方案:
O = Struct.new(:name, :price)
o1 = O.new('a', 1)
o2 = O.new('b', 2)
o3 = O.new('c', 3)
o4 = O.new('d', 4)
o5 = O.new('e', 5)
MASTER_INVENTORY = [o1, o2, o3, o4, o5]
def buy_item_index(p)
puts "-----buy #{p}"
end
def main_menu
puts '-----Main Menu'
end
def prepare_buy_menu_and_case
choices = ['Go [B]ack']
i = 1
MASTER_INVENTORY.each do |obj|
choices << "[#{i}] Buy #{obj.name} Price: #{obj.price}"
i += 1
end
@choice_map = choices.join("\n")
@case_body = ''
MASTER_INVENTORY.size.times do | number0 |
number = number0 + 1
@case_body <<
"when '#{number}'
buy_item_index(#{number})
buy_menu\n"
puts "when #{number} generated"
end
puts "@case_body=#{@case_body}"
end
def buy_menu
puts @choice_map
input = gets.chomp
eval("
case input
when 'b', 'B'
main_menu
#{@case_body}
else
puts 'Not a valid input'
buy_menu
end
")
end
prepare_buy_menu_and_case
buy_menu
这一次,关于已分配但未使用的变量的警告可以忽略
在prepare\u buy\u menu\u和
中分别准备菜单和case
可以避免每次调用buy\u menu
时重新计算它们
最初的放置
是为了我的舒适,当然可以删除。在Ruby中有很多方法。这是一个解决方案:
O = Struct.new(:name, :price)
o1 = O.new('a', 1)
o2 = O.new('b', 2)
o3 = O.new('c', 3)
o4 = O.new('d', 4)
o5 = O.new('e', 5)
MASTER_INVENTORY = [o1, o2, o3, o4, o5]
def buy_item_index(p)
puts "-----buy #{p}"
end
def main_menu
puts '-----Main Menu'
end
def prepare_buy_menu_and_case
choices = ['Go [B]ack']
i = 1
MASTER_INVENTORY.each do |obj|
choices << "[#{i}] Buy #{obj.name} Price: #{obj.price}"
i += 1
end
@choice_map = choices.join("\n")
@case_body = ''
MASTER_INVENTORY.size.times do | number0 |
number = number0 + 1
@case_body <<
"when '#{number}'
buy_item_index(#{number})
buy_menu\n"
puts "when #{number} generated"
end
puts "@case_body=#{@case_body}"
end
def buy_menu
puts @choice_map
input = gets.chomp
eval("
case input
when 'b', 'B'
main_menu
#{@case_body}
else
puts 'Not a valid input'
buy_menu
end
")
end
prepare_buy_menu_and_case
buy_menu
case input.to_i
when 1..choices.count-1
buy_item_index(input.to_i)
else
puts "Not a valid input" unless input.downcase == 'b'
end
buy_menu
这一次,关于已分配但未使用的变量的警告可以忽略
在prepare\u buy\u menu\u和
中分别准备菜单和case
可以避免每次调用buy\u menu
时重新计算它们
最初的放置
是为了我的舒适,当然可以移除
case input.to_i
when 1..choices.count-1
buy_item_index(input.to_i)
else
puts "Not a valid input" unless input.downcase == 'b'
end
buy_menu
或:
更新:一个案例适用于所有人:
case input
when 'b', 'B'
main_menu
when ->(i) { (1..choices.count-1).cover? i.to_i }
buy_item_index(input.to_i)
buy_menu
else
puts "Not a valid input"
buy_menu
end
或:
更新:一个案例适用于所有人:
case input
when 'b', 'B'
main_menu
when ->(i) { (1..choices.count-1).cover? i.to_i }
buy_item_index(input.to_i)
buy_menu
else
puts "Not a valid input"
buy_menu
end
你不能<代码>案例
构造适用于静态条件。这不是正确的选择。如果你想处理你所拥有的,使用一个函数(方法)。@sawa你一定是在开玩笑。那我们最好的朋友如何评价呢?你不能<代码>案例
构造适用于静态条件。这不是正确的选择。如果你想处理你所拥有的,使用一个函数(方法)。@sawa你一定是在开玩笑。那我们最好的朋友eval呢?谢谢你的回复,但对我来说不太管用。这可能与部分回复有关,需要在引号中加上另一个without@BillBisco“不起作用”是指一般情况。更准确一点。你得到了什么结果?还请注意,Rots发布的解决方案使用数值操作,而您最初的尝试使用字符串操作。链接的repl有一个非数值的解决方案。这超出了问题的范围,所以将其从答案中删除。谢谢您的回答,但这对我来说并不太有效。这可能与部分回复有关,需要在引号中加上另一个without@BillBisco“不起作用”是指一般情况。更准确一点。你得到了什么结果?还请注意,Rots发布的解决方案使用数值操作,而您最初的尝试使用字符串操作。链接的repl有一个非数值的解决方案。这超出了问题的范围,所以将其从答案中删除。它不是完全回答了您的问题吗?谢谢你的反馈。嗨,伯纳德,谢谢你的回复。我有点卡住了,因为我无法完全复制您在Cloud9中所做的工作。我会退后一步,尝试实现您的“准备”\u“购买”菜单和案例,看看是否可以让它工作!我刚测试过这个,它确实有效!我注释掉了一些put。很好。谢谢它不是完全回答了你的问题吗?谢谢你的反馈。嗨,伯纳德,谢谢你的回复。我有点卡住了,因为我无法完全复制您在Cloud9中所做的工作。我会退后一步,尝试实现您的“准备”\u“购买”菜单和案例,看看是否可以让它工作!我刚刚测试了这个,它确实有效!我注释掉了一些put。很好。谢谢非常感谢。这真的很有帮助!我实现了如下代码的一个版本:case input.to_I when 1..(choices.count-1)buy_item_index(input.to_I)buy_menu()结束case input when“b”,“b”主菜单else会显示“无效输入”#除非输入。看在上帝的份上,你为什么需要2个case
s?!这是一种代码气味。出于某种原因,当我将您的代码从case input.to_I更改为case input时,它无法注册任何数字,例如1、2、34等。它将它们注册为无效输入。有两种情况下,它最终会起作用。我希望有一个案子,但其他案子不行谢谢!太棒了!需要注意的是,对于这种特殊情况,它必须是(1..choices.count-1),因为Go[B]ack也是一种选择,因此如果在编号列表选项之后键入第一个数字,则会导致错误。count-1
::已修复。谢谢!这真的很有帮助!我实现了如下代码的一个版本:case input.to_I when 1..(choices.count-1)buy_item_index(input.to_I)buy_menu()结束case input when“b”,“b”主菜单else会显示“无效输入”#除非输入。看在上帝的份上,你为什么需要2个case
s?!这是一种代码气味。出于某种原因,当我将您的代码从case input.to_I更改为case input时,它无法注册任何数字,例如1、2、34等。它将它们注册为无效输入。有两种情况下,它最终会起作用。我希望有一个案子,但其他案子不行谢谢!太棒了!需要注意的是,对于这种特殊情况,它必须是(1..choices.count-1),因为Go[B]ack也是一种选择,因此如果在编号列表选项之后键入第一个数字,则会导致错误。count-1
::已修复。