示例 ruby 程序存在 运行 个错误,无法解决

Sample ruby program keeps running with errors, can't figure them out

好吧,我已经尽了最大的努力让这段代码刚好运行而不吐出错误,但无济于事。希望你能帮助我。

require 'launchy'

#def linebreak(breakline)

def program()
    puts "Welcome to test program v1. Would you like to continue? ENTER y for Yes or n for no"
    user_input_1 = gets.chomp

    if user_input_1 == "y"
        puts "How would you like to proceed CRASH | TEXTMAKER | UNDECIDED // CASE SENSITIVE"
        user_input_2 = gets.chomp

        if user_input_2 == "CRASH"
            while true Launchy.open("http://google.com")
        elsif user_input_2 = "TEXTMAKER"
            while true out_file.puts("test program v1")
        else
            puts "You have not entered a method."
        elsif user_input_1 == "n"
            abort
        else
            puts "That is not a valid command. Please run the script again."
        end
    end

我看到了很多问题。

  1. 这是无效的:

    while true Launchy.open("http://google.com")
    

    这也不是:

    while true out_file.puts("test program v1")
    

    不过,我无法告诉您如何解决这个问题,因为您根本不清楚您要做什么。

  2. 一个if块可能只有一个else,而且一定要来elsifs.

  3. 此处:

    elsif user_input_2 = "TEXTMAKER"
    

    您正在为 user_input_2 分配一个新值。我猜您打算使用相等运算符,即 ==.

  4. 您的 def 区块没有 end。在我编辑您的代码以使用正确的缩进后,这变得很明显。使用合理的缩进和空格可以避免很多麻烦。

好吧,有一些问题,但不要担心一切都可以 已修复!

让我们从你做得好的地方开始

  • 在大多数情况下使用布尔值做得很好,大多数初学者似乎并不 理解 == 表示相等,而 = 表示完全相同 不同

  • 干得好 puts 并且使用得当,还有其他的 我稍后将介绍的方法,在您的环境中看起来会好得多 case.

现在让我们介绍一下可以解决的问题

  • 正如我上面所说,在大多数情况下你正确地使用了你的布尔值 但是你似乎错过了一个。 elsif user_input_2 = "TEXTMAKER" 你需要一个 == 来表明它是相等的。

  • 您的 while 循环似乎没有任何意义,因为您从未真正将任何内容设置为 true。在 Ruby 它是高度 建议永远不要使用 while 循环,当然有时候 你必须这样做,但前提是你已经尝试了所有其他方法。

  • elsif; else; elsif 从不else 之后使用 elsifelsif 是提供一个例外,在你的情况下还有更多 一个选项,所以在 else 之前使用 elsifs,你最好在这里使用 case 语句。
  • 不要听起来像个混蛋,但你的缩进太可怕了。良好的缩进会带来更多问题,在 Ruby 中有两个 空间,这里是风格指南: https://github.com/bbatsov/ruby-style-guide
  • 永远不要让您的用户选项区分大小写,如果其他人要使用您的程序,只需假设他们是世界上最愚蠢的人并让他们非常容易。 user_input_2.gets.chomp.upcase 这将设置它,以便无论他们如何输入文本,它始终是大写的。
  • 你错过了一个 end 一旦你使用了正确的缩进,这就会变得清楚

好吧,让我们重写这个东西:

require 'launchy'

def program #<= you don't need the parentheses
  print "Welcome to the test program version 1, to continue type 'c' to exit type 'e': "
  user_input = gets.chomp.upcase
  if user_input == "C"
    program_choices
  elsif user_input == "E"
    puts "Exiting.."
    exit
    #if you really want to use abort
    #abort("Exiting..") 
    #you won't need to use exit if you use abort
  else 
    puts "Invalid input, try again"
    program #<= this is a loop known as recursion, don't use it to much
  end
end

def program_choices
  print "Pick an option, the choices include CRASH | TEXTMAKER | UNDECIDED: "
  user_input = gets.chomp.upcase
  case user_input #<= this is how you start a case statement
  when "CRASH"
    Launchy.open("http://google.com")
  when "TEXTMAKER"
    write_test_data
  when "UNDECIDED"
    puts "You really need to make up your mind.." #<= have some fun with it, that's the point of programming.
    program_choices
  else
    puts "Invalid input, try again"
    program_choices
  end
end

def write_test_data
  x = "Test file version 1"
  if File.exist?("path/to/test/file.txt")
    File.open("path/to/test/file.txt", "a"){ |s| s.write(x) }
  else 
    new_test_file = File.new("path/to/test/file.txt")
    new_test_file.puts(x)
  end
end

砰!您的程序已启动 运行!如果您对任何事情有任何疑问,请毫不犹豫地提出,编程可能非常棘手,也可能非常困难。坚持下去,你会到达那里!