错误的参数数量(给定1,预期4)

时间:2017-03-13 19:38:47

标签: ruby ruby-on-rails-4

我有一个接受4个输入的实例方法

class Foo
  def baz(a, b, c, d)
    puts 'something'
  end
end

我正在编写实例方法的规范,我有

let(:resp) {
  Foo.new.baz (
    a: '97334',
    b: '38',
    c: '0001110000',
    d: 'N')
}

我尝试将其更改为下面的但没有运气

let(:resp) {
  Foo.new.baz '97334', '38', '0001110000','N')
}

为什么我在Foo类的实例方法中得到错误的参数数量?

由于

2 个答案:

答案 0 :(得分:1)

在ruby< = 1.9中,没有命名参数,但您可以使用哈希实现相同的效果。您收到错误的原因是您只有一个参数是因为ruby假定您传递的是单个哈希而不是4个参数。你可以这样工作:

class Foo
  def baz(myhash)
    puts "#{myhash[:a]}, #{myhash[:b]}"
  end
end

Foo.new.baz(a: "hello", b: "world) #=> "hello, world"

在ruby 2.0中,存在命名参数,但它们只能是可选的:

class Foo
  def baz(a: "hi", b: "mum")
    puts "#{myhash[:a]}, #{myhash[:b]}"
  end
end

Foo.new.baz(a: "hello", b: "world) #=> "hello, world"
Foo.new.baz() #=> "hi, mum"

在ruby> = 2.1中,命名参数可以是可选的或必需的。您可以通过指定它们来使命名参数无需默认值,如下所示:

class Foo
  def baz(a:, b:)
    puts "#{myhash[:a]}, #{myhash[:b]}"
  end
end

Foo.new.baz(a: "hello", b: "world) #=> "hello, world"

在所有这些红宝石中,如果删除额外的括号,您的上一个代码段应该有效:

class Foo
  def baz(a, b, c, d)
    puts 'something'
  end
end

Foo.new.baz '97334', '38', '0001110000','N'

答案 1 :(得分:0)

尝试:

:P

您传递的关键字参数可以被视为传递一个let(:resp) { Foo.new.baz( '97334', '38', '0001110000', 'N' ) } 。所以你的代码基本上等同于:

Hash

上面这个例子显然只有1个参数。

解决此问题的另一种方法是参数化函数调用:

params = Hash.new
params[:a] = '97334'
params[:b] = '38'
params[:c] = '0001110000'
params[:d] = 'N'
let(:resp){
    Foo.new.baz(params)
}

通常,当函数有很多args时,这是首选,因为它不需要函数用户知道函数参数的特定顺序,只需要哪些参数。