Ruby类方法的参数数量错误

时间:2018-03-13 19:40:43

标签: ruby class methods

class Array
def pairs(target)
  pairs_array = []
  self.each_with_index do |number, idx|
    self.each_with_index do |number2, idx2|
      if (number + number2 == target)
        pairs << [idx, idx2]
      end
    end
  end
  pairs
end
end

arr = Array.new
arr << "1" << "3" << "1" << "2" << "3" << "0"
puts arr.pairs(3)

错误讯息:

Traceback (most recent call last):
    2: from main.rb:42:in `<main>'
    1: from main.rb:36:in `pairs'
main.rb:27:in `pairs': wrong number of arguments (given 0, expected 1) (ArgumentError)

我对此比较陌生,所以如果这是一个愚蠢的问题,我很抱歉,但我只是错误地调用了这个方法吗?我试图调用它并传递3作为目标值。

感谢。

2 个答案:

答案 0 :(得分:2)

问题是,你的对方法中的最后一个语句是&#34; pair&#34;,这意味着你做了另一个(这次是递归的)函数调用。此函数调用在没有参数的情况下发生,这会导致错误。

我假设你真的想把所有的结果都放到变量&#34; pairs_array&#34;并返回它(而不是&#34;对&#34;)。

此外

  if (number + number2 == target)
    #some code
  end

结合使用
arr = Array.new
arr << "1" << "3" << "1" << "2" << "3" << "0"
puts arr.pairs(3)

将始终返回false,例如&#34; 1&#34; +&#34; 2&#34;是&#34; 12&#34;,而1 + 2是3. =&gt;请注意您正在使用的数据类型。

答案 1 :(得分:1)

问题是ruby正在解释这一行

pairs

作为函数调用

pairs(target)

而不是退货声明。要解决此问题,请重命名pairs数组变量,使其与您的函数名称不匹配。我相信您已经以​​pairs_array = []的形式完成了此操作,因此您应该拨打pairs << [idx, idx2]&lt;&lt; pairs_array来调用pair_array。 [idx,idx2]存储对。然后,要返回数组,请在函数末尾调用const {a, c} = obj

另一个错误是您将数字作为字符串而不是整数传递,因此当您将两个变量一起添加时,ruby正在进行字符串连接,而不是简单地将两个数字相加,以解决此问题,传入数字为整数(即​​删除数字周围的引号)