我有一个接受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类的实例方法中得到错误的参数数量?
由于
答案 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时,这是首选,因为它不需要函数用户知道函数参数的特定顺序,只需要哪些参数。