我正在尝试做

    response = gets.chomp
    response == "a" ? puts "yes" : puts "no"

终端提示:
syntax error, unexpected ':', expecting keyword_end
    response == "a" ? puts "yes" : puts "no"
                                  ^

我究竟做错了什么?

最佳答案

这是你的错误:

response == "a" ? puts "yes" : puts "no"
  #=> syntax error, unexpected ':', expecting end-of-input
  #   response == "a" ? puts "yes" : puts "no"
  #                           ^

Ruby 正在寻找第一个 puts ' 参数。由于它们没有括在括号中,因此她假设它们位于 puts 之后的逗号分隔列表中。第一个是 "yes" ,但 "yes" 后面没有逗号,因此引发异常。

我们试试看:
response == "a" ? (puts "yes") : puts "no"
  #=> syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '('
  #   response == "a" ? (puts "yes") : puts "no"
  #                                          ^

( response == "a" ? puts("yes") : puts "no" 引发相同的异常。)

我不知道为什么这不起作用。异常表示在第二个 do...end 之后需要一个块( {..}puts )或左括号(用于封闭参数)。 Kernel#puts 调用 $stdout.puts 。由于 $stdout 返回一个 IO 对象,然后会调用 IO#puts,但文档没有说明问题。也许读者可以提供一个解释。

你可以这样写:
response == "a" ? (puts "yes") : (puts "no")

或者
response == "a" ? puts("yes") : puts("no")

或(最好,imo)
puts response == "a"  ? "yes" : "no"

关于ruby if-else one-liner with "puts"不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32617761/

10-13 01:29