【问题标题】:Ruby: Condition as a variable does not workRuby:条件作为变量不起作用
【发布时间】:2021-08-04 15:12:35
【问题描述】:

刚开始学习 Ruby 中的循环和流控制,并被这个练习卡住了。我一直在测试和寻找答案,但没有找到任何答案,所以我在这里发布。

如果我有这样的代码设置:

ask_play = ''
loop do
    print "Play?: "
    ask_play = gets.chomp
    break if (ask_play == 'n') || (ask_play == 'N')
end

然后我输入n或N后退出循环。

但是,如果我的代码设置如下:

ask_play = ''
play_stop = (ask_play == 'n') || (ask_play == 'N')
loop do
    print "Play?: "
    ask_play = gets.chomp
    break if play_stop
end

条件似乎不起作用。即使在输入 n 或 N 后,我仍然会继续循环,我只是不知道为什么。

【问题讨论】:

  • 提示 #1:第 2 行的 ask_play 的值是多少?提示 #2:它在第 1 行被分配。

标签: ruby loops conditional-statements


【解决方案1】:

您可以使用proc 来封装条件:

ask_play = ''
play_stop = -> { ask_play == 'n' || ask_play == 'N' }

loop do
  print "Play?: "
  ask_play = gets.chomp
  break if play_stop.call
end

您也可以将字符串传递到 proc,而不是引用局部变量:

play_stop = -> (s) { s == 'n' || s == 'N' }

loop do
  print "Play?: "
  break if play_stop.call(gets.chomp)
end

Procs 在case 语句中也能很好地工作:

play_stop = -> (s) { s == 'n' || s == 'N' }

loop do
  print "Play?: "
  case gets.chomp
  when play_stop
    break
  end
end

【讨论】:

    【解决方案2】:

    play_stop = (ask_play == 'n') || (ask_play == 'N') 在循环开始之前被评估。它将play_stop 变量设置为false,因为分配给空字符串的ask_play 变量既不是n 也不是N。 看起来您想封装条件的逻辑。您可以创建一个方法并向其传递一个值。

    def play_stop(input)
      input == 'n' || input == 'N'
    end
    
    loop do
        print "Play?: "
        ask_play = gets.chomp
        break if play_stop(ask_play)
    end
    

    【讨论】:

    • 这正是正在发生的事情。在将条件放入方法后,我的逻辑现在起作用了。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多