如果语句语法错误,则意外的keyword_end

时间:2017-05-04 18:24:09

标签: ruby

我正在hackerrank进行练习,我要求比较一组三胞胎以获得分数。在我最初提交之后,我想尝试一些更优雅的东西(也就是说有更少的条件),所以我做了以下代码:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="DotNetOpenAuth.Core"
                              publicKeyToken="2780ccd10d57b246" />
            <bindingRedirect oldVersion="1.0.0.0-4.0.0.0"
                             newVersion="4.1.0.0" />
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

但我收到以下错误:

def solve(a0, a1, a2, b0, b1, b2)
    # Complete this function
    aS = 0
    bS = 0

    alpha = [a0, a1, a2]
    beta = [b0, b1, b2]

     (1..3).each do |i|
         if (alpha.(i) > beta.(i)) then aS++ end
         if (alpha.(i) < beta.(i)) then bS++ end
     end   

    return aS, bS

end

如果我删除每个if语句的solution.rb:12: syntax error, unexpected keyword_end .(i) > beta.(i)) then aS++ end ^ solution.rb:13: syntax error, unexpected keyword_end .(i) < beta.(i)) then bS++ end ^ solution.rb:31: syntax error, unexpected end-of-input, expecting keyword_end ,我会收到一个新错误,指出语法错误,意外的输入结束,期望keyword_end位于类的end

我最好的猜测是,我没有正确关闭或构建我的if,我希望有人能指出我正确的方向。

2 个答案:

答案 0 :(得分:4)

Ruby没有增量一元运算符。相反,bS+=1。请参阅以下内容作为使用irb

的修复示例
irb(main):001:0> x = 2
=> 2
irb(main):002:0> if x > 1 then x++ end
SyntaxError: (irb):2: syntax error, unexpected keyword_end
    from /opt/chefdk/embedded/bin/irb:11:in `<main>'
irb(main):003:0> if x > 1 then x+=1 end
=> 3

答案 1 :(得分:3)

Ruby中没有增量运算符++,而是使用value += 1

尝试:

def solve(a0, a1, a2, b0, b1, b2)
  aS = 0
  bS = 0

  alpha = [a0, a1, a2]
  beta  = [b0, b1, b2]

  (0..2).to_a.each do |i|
    aS += 1 if alpha[i] > beta[i]
    bS += 1 if alpha[i] < beta[i]
  end   

  [aS, bS]
end

p solve(1, 2, 3, 4, 5, 6)
# => [0, 3]

在Ruby中,您不需要指定return它将是您在函数(或范围)中放置的最后一个值,您也必须要转换为数组范围( 1..3),并且当您使用它的每个索引来检查alphabeta数组时,当索引获取时,您将获得nil数字3,因为这些数组上没有索引3,请尝试使用(0..2).to_a

要增加初始变量,请使用+=代替++并检查数组的索引,您可以使用方括号alpha[i]来执行此操作(不需要使用方括号syntax error点或作为方法)。

要返回多个值,请尝试将其作为数组执行,只需&#34; plain&#34;对象将抛出if ... then ... end

do_something if this_happens可缩短为@ECATS_ID