ruby if-else one-liner with"puts"not working

nig*_*ire 4 ruby if-statement

我正在努力做到

    response = gets.chomp
    response == "a" ? puts "yes" : puts "no"
Run Code Online (Sandbox Code Playgroud)

终端抱怨:

syntax error, unexpected ':', expecting keyword_end
    response == "a" ? puts "yes" : puts "no"
                                  ^
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Car*_*and 6

这是你的错误:

response == "a" ? puts "yes" : puts "no"
  #=> syntax error, unexpected ':', expecting end-of-input
  #   response == "a" ? puts "yes" : puts "no"
  #                           ^
Run Code Online (Sandbox Code Playgroud)

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"
  #                                          ^
Run Code Online (Sandbox Code Playgroud)

(response == "a" ? puts("yes") : puts "no"引发同样的例外.)

我不知道为什么这不起作用.例外情况表明它在第二个之后期望一个块(do...end{..})或左括号(用于封闭参数)puts.内核#调用$stdout.puts.当$stdout返回一个IO对象时,IO#puts随后被调用,但该文档没有解决问题.也许读者可以提供解释.

您可以按如下方式编写它:

response == "a" ? (puts "yes") : (puts "no")
Run Code Online (Sandbox Code Playgroud)

要么

response == "a" ? puts("yes") : puts("no")
Run Code Online (Sandbox Code Playgroud)

或者(最好的,imo)

puts response == "a"  ? "yes" : "no"
Run Code Online (Sandbox Code Playgroud)

  • 绝对使用`puts response =="a"?"是":"不",而不是 (2认同)