意外的关键字 - 否则

Ben*_*nts -2 ruby

我有一个方法返回找出哪个给定数字在均匀度上与其他数字不同并返回它的索引(+1).

def iq_test(numbers)
  new_array = numbers.split(" ").collect {|n| n.to_i}
  x = new_array.select(&:even?)
    y = new_array.select(&:odd?)

  if x.count > y.count
    new_array.split.each_with_index do |value, index| 
      "#{index + 1}".to_i if value % 3 != 0
  else  y.count > x.count
      "#{index + 1}".to_i if value % 2 == 0
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

例如iq_test("2 4 7 8 10")应该返回3.

但是,我收到了

语法错误,意外的keyword_else,期待keyword_end

我无法找到我没有关闭一些代码的地方.

Mar*_*mas 5

这将是部分代码审查和答案.让我们从第一部分开始:

  new_array = numbers.split(" ").collect {|n| n.to_i}
  x = new_array.select(&:even?)
    y = new_array.select(&:odd?)
Run Code Online (Sandbox Code Playgroud)
  • 花时间考虑好的变量名称.我不会使用"new_array"作为变量名,因为它没有提供任何关于它包含什么的线索.做这种事太多次了,程序变得难以理解.
  • xyevensodds,不是吗?那些变量名称会更好.
  • 常见的Ruby习语是为数组使用复数名称,为其他所有使用单数名称.
  • split通过对空白默认分裂,所以(" ")是不必要的.
  • 缩进压痕.
  • 您的选择很好,但有一个捷径:可枚举的partition.
  • 这实际上是我自己的风格,但我map在处理数组中的所有值时使用,并且collect仅在执行从对象数组中提取属性时使用.(换句话说,我map经常使用).
  • 请注意,这(&:to_i)是一个快捷方式{|n| n.to_i}

考虑到上述情况重写,这部分可能如下所示:

numbers = input.split.map(&:to_i)
evens, odds = numbers.partition(&:even?)
Run Code Online (Sandbox Code Playgroud)

现在让我们看看其余的:

if x.count > y.count
    new_array.split.each_with_index do |value, index| 
      "#{index + 1}".to_i if value % 3 != 0
  else  y.count > x.count
      "#{index + 1}".to_i if value % 2 == 0
    end
  end
Run Code Online (Sandbox Code Playgroud)

让我们考虑你得到的错误信息:意外的关键字else; 预期end.这包含了回答问题所需要知道的所有内容(如果您考虑这些问题,您会发现大多数错误消息都会发生).它说它找到了else预期的地方end.而这正是问题所在,您需要endelse关闭do/end块之前放置.此外,您的else部分缺少迭代逻辑.

其他说明:

  • 再次,小心缩进.你end的内容并不符合他们的结局.正确的对齐可以帮助捕获这些类型的错误.使用像Rubymine这样的IDE或者支持Ruby的复杂文本编辑器也可以提供帮助.
  • else条款是独立的,你不要在它们之后加上条件.也许你的意思elsif是霍尔格评论.
  • 使用字符串插值("#{}")将表达式转换为字符串.在这里,你将转换index + 1为一个字符串,然后回到一个整数.to_i,取消它,可以这么说.简单地说index + 1会.
  • Array#index 可用于确定值的索引.
  • 目前尚不清楚是否需要所有指数以防万一.

这是考虑上述情况的版本:

if evens.count > odds.count
  odds.map{|n| numbers.index(n) + 1}
elsif odds.count > evens.count
  evens.map{|n| numbers.index(n) + 1}
end
Run Code Online (Sandbox Code Playgroud)

如果你喜欢这种东西,请将你的工作代码带到http://codereview.stackexchange.com/!