使用print / puts for {} loop vs do end loop - ruby

时间:2017-03-04 10:12:54

标签: ruby

我正在努力弄清楚/理解为什么会出现以下语法错误:

syntax error, unexpected tIDENTIFIER, expecting '}'
odds.each { |x| x = x * 2 puts x }
                              ^
跑步时

odds = [1,3,5,7,9]

odds.each { |x| x = x * 2 puts x }

这适用于打印和放置。但是在运行时:

odds.each do |x|
  x = x * 2
  puts x
end

我得到了我正在寻找的结果。因此,即使我能够在其他情况下使用,也不能在此示例中使用带有{}的print / puts。

2 个答案:

答案 0 :(得分:2)

  

因此我不能在此示例中使用带有{}的print / puts

你可以。

odds.each { |x| x = x * 2; puts x }
                         ↑
# 2
# 6
# 10
# 14
# 18

它与{}无关,您只需要使用换行符或;分隔两个语句。

答案 1 :(得分:0)

你的结论是错误的:

  

因此我不能在此示例中使用带有{}的print / puts

您的错误在于,在测试您的假设时,您会混淆几个变量。你应该确保当你想要测试一些东西时,只测试那件事而不是其他东西。

在这种特殊情况下,您的假设是"我不能将puts{ / }"一起使用。但是,当您测试它时,您可以更改两个事物:

  1. 您将do / end更改为{ / }
  2. 删除换行符
  3. 现在你得到一个错误。但是,由于您一次更改了两件事,因此无法知道导致错误的两个更改中的哪一个。你认为这是第一次改变,但你无法知道。您唯一知道的是第一个或第二个或两个更改的组合导致错误。

    您需要分别测试这两个更改:

    原始代码:

    odds.each do |x|
      x = x * 2
      puts x
    end
    # works
    

    测试#1:

    odds.each { |x|
      x = x * 2
      puts x
    }
    # works
    

    测试21:

    odds.each do |x| x = x * 2 puts x end
    # SyntaxError
    

    啊哈!所以,事实证明,毕竟它并非花括号!这是划线!