Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何理解Ruby中的结束标记/循环关系?_Ruby_If Statement_While Loop - Fatal编程技术网

如何理解Ruby中的结束标记/循环关系?

如何理解Ruby中的结束标记/循环关系?,ruby,if-statement,while-loop,Ruby,If Statement,While Loop,世界! 对于所有类型的编程来说都是新手,所以也许我不了解循环/if/else通常是如何工作的? 我的问题是: 每当我运行这个程序时,它都会正常运行,除了退出的部分,也就是说“再见”。 每当我说“再见”时,奶奶回答说“不,从1943年起就没有了”,然后程序退出。 我的问题是,如果我将语句=get.chomp移动到两个端点内部之外的任何地方,它就会无限循环,或者给我同样的问题 这是我正在使用的代码 puts "Talk to grandma!" puts "To stop talking to Gr

世界! 对于所有类型的编程来说都是新手,所以也许我不了解循环/if/else通常是如何工作的? 我的问题是:

每当我运行这个程序时,它都会正常运行,除了退出的部分,也就是说“再见”。 每当我说“再见”时,奶奶回答说“不,从1943年起就没有了”,然后程序退出。 我的问题是,如果我将
语句=get.chomp
移动到两个
端点
内部之外的任何地方,它就会无限循环,或者给我同样的问题

这是我正在使用的代码

puts "Talk to grandma!"
puts "To stop talking to Grandma say 'BYE'"
sleep 1
puts "Remember grandma has bad hearing. You might need to Yell!"

statement = ""
while statement != "BYE"

    statement =gets.chomp
 if statement != statement.upcase
    puts "WHAT?! SPEAK UP!"

else
    year = rand(1940..1955).to_s
    puts "NO, NOT SINCE " + year

end
end
问题:在说“再见”时退出,但仅在说“不,不是因为”等之后退出

但是,当我将代码更改为:

puts "Talk to grandma!"
puts "To stop talking to Grandma say 'BYE'"
sleep 1
puts "Remember grandma has bad hearing. You might need to Yell!"

statement = gets.chomp
while statement != "BYE"

  if statement != statement.upcase
    puts "WHAT?! SPEAK UP!"

 else
     year = rand(1940..1955).to_s
     puts "NO, NOT SINCE " + year

   end
statement= gets.chomp
end
然后程序就可以完美地工作了

循环不是说结束就结束了吗?如果底部的
statement=gets.chomp
已经结束,它将如何包含在循环中?还是我误解了,第一个端点与if/else有关,第二个端点与“循环的结束”有关

我正在与Chris Pines自学如何使用Ruby编程,但是。。。它所说的是“循环中的所有内容在
结束之前都会重复。”

以前的代码:

while statement != "BYE"
    statement =gets.chomp
    # if-else validation
end
这意味着您要执行以下步骤:

  • 读取用户输入
  • if-else
    语句验证它
  • 继续循环
  • 根据
    while
    循环验证它
  • 后一种代码:

    statement= gets.chomp
    while statement != "BYE"
        # if-else validation
        statement= gets.chomp
    end
    
    在这里,您可以读取用户输入,然后启动
    while
    循环:

  • 根据
    while
    循环验证它
  • 使用
    if-else
    语句验证它
  • 读取用户输入
  • 继续循环
  • 您决定验证用户输入以在
    循环中继续时,相关部分为,以及您在验证之前或之后所做的操作。注意,这不属于Ruby,而是属于任何编程语言。在这种情况下,逻辑是什么最重要

    简而言之,的顺序很重要


    第一个端点与if/else相关,第二个端点与“循环的结束”相关

    是的,这是完全正确的。这在缩进代码时更容易理解:

    while statement != "BYE"               # <----.
        statement =gets.chomp              #      |
        if statement != statement.upcase   # <-.  |
            puts "WHAT?! SPEAK UP!"        #   |  |
        else                               #   |  |
            year = rand(1940..1955).to_s   #   |  |
            puts "NO, NOT SINCE " + year   #   |  |
        end                                # <-.  |
    end                                    # <----.
    

    您的脚本存在许多问题。以下内容(在我看来)更易于阅读和调试,适用于Ruby 2.1.2的临时测试:

    puts "Talk to grandma!"
    puts "To stop talking to Grandma say 'BYE'"
    puts "Remember grandma has bad hearing. You might need to Yell!"
    
    loop do
      case gets.chomp
      when 'BYE'
        break
      when /[[:lower:]]/
        puts 'WHAT?! SPEAK UP!'
      else
        puts "NO, NOT SINCE #{rand 1940..1955}"
      end
    end
    

    我很欣赏你更精简的脚本,但我的问题不一定是让它更漂亮,而是我显然不了解基本原理。看看你的新代码,我还没有学会do/case/when/break等,所以它看起来像中文(我只会说英语/日语)。一旦我学会了基本知识,我一定会检查你的代码,看看我能如何改进!非常感谢你!通过使用箭头,我终于明白了发生了什么,它在哪里跳跃,以及我如何操纵命令使其正确工作。不客气。不要忘记缩进代码,这将有助于代码的可读性,并发现一些问题,如缺少
    end
    或类似的错误。
    puts "Talk to grandma!"
    puts "To stop talking to Grandma say 'BYE'"
    puts "Remember grandma has bad hearing. You might need to Yell!"
    
    loop do
      case gets.chomp
      when 'BYE'
        break
      when /[[:lower:]]/
        puts 'WHAT?! SPEAK UP!'
      else
        puts "NO, NOT SINCE #{rand 1940..1955}"
      end
    end