ruby - 我该如何解决这个关于 end 关键字的 Ruby 语法错误?

标签 ruby syntax compiler-errors syntax-error

这是Exercism 上的一个问题。到目前为止,将每个解决方案都作为类方法似乎是一种奇怪的处理方式,但这不是我的想法。无论如何,这是代码:

class ResistorColorDuo
  @@colors = %w(
    black
    brown
    red
    orange
    yellow
    green
    blue
    violet
    grey
    white)

  def self.value(array)
    @@colors.index array[0] * 10 + @@colors.index array[1]
  end
end

错误信息:

Traceback (most recent call last):
    1: from resistor_color_duo_test.rb:2:in `<main>'
resistor_color_duo_test.rb:2:in `require_relative': /home/muhammad/exercism/ruby/resistor-color-duo/resistor_color_duo.rb:15: syntax error, unexpected tIDENTIFIER, expecting keyword_end (SyntaxError)
...0]) * 10 + @@colors.index array[1]

我没有看到问题,因为 end 关键字都得到了适当的平衡。我应该如何解决这个问题?

最佳答案

I was under the impression that parentheses were optional in this instance.

是也不是。括号确实是可选的,但这并不意味着不使用它们不会改变代码的行为,只是不会出现语法错误。

如果 Ruby 在方法后立即遇到空格,它将解析该行的其余部分作为其参数。因此,如果行中没有任何不属于方法参数的内容,则括号是可选的。如果这样做,您必须通过将其括在括号中来指定该行的哪一部分构成您的参数列表。

这里有一个相关的潜在问题需要注意。考虑这些只有一个空格不同的行:

f(3+2)+1
f (3+2)+1

其中第一个将 5 传递给函数 f 并将 1 添加到结果中。第二个将 6 传递给函数 f。出于同样的原因:如果 Ruby 在方法调用后立即遇到空格,则该行的其余部分将被解析为参数列表。

我从 Matz 的书中借用了这个例子,他在书中 Eloquent 地称之为“有害的空白依赖”。您必须小心方法调用行上的空格。

这也是您遇到错误的原因。 Ruby 无法解析您的代码行,因为其中有两个方法调用。所以第二个导致错误:Ruby 期待 end 关键字,而是遇到另一个方法调用。

在第二个括号中添加括号可以消除语法错误:

@@colors.index array[0] * 10 + @@colors.index(array[1])

但它可能不会给您想要的结果。它将像这样解析它:

@@colors.index(array[0] * 10 + @@colors.index(array[1]))

因此,对它们都使用括号。我不确定你想做什么(不确定你想乘以 10 的结果),但像这样:

@@colors.index(array[0]) * 10 + @@colors.index(array[1])

一般来说,我更喜欢用括号括住方法调用的参数。几乎唯一一次我不使用它们的是 putsprintp(编辑:以及我忘记的所有其他那些Jörg 在下面的评论中添加了)。

注意不要在方法调用和左括号之间放置空格。

关于ruby - 我该如何解决这个关于 end 关键字的 Ruby 语法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58347311/

相关文章:

ruby-on-rails - 在 rails 5 上注释 Gem ruby

java - 这行代码有语法错误吗?

xslt - 使用 xslt 将 xhtml 转换为 wiki 语法

ruby-on-rails - 如何应用关联规则

ruby-on-rails - 确保在保存并创建主模型后创建或保存关联 Rails 4

c++ - 错误 : Invalid type 'int[int]' for array subscript

ios - 如何解决xcode 5 中的apple LLVM 5.0 错误?

java - 在if语句中创建对象

c++ - Gtest : Expected Class-Name Before '{'

ruby-on-rails - 如何在ruby中组合字符串