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
::已修复。