我正在尝试使用此方法的splat运算符,因此我可以将多个参数作为菜单中的项目传递。
def place_order *items
@restaurant.receive_order(*items)
end
测试如下
it "should be able to order multiple items from menu" do
expect(user.place_order("burger", "chips")).to eq(:ordered)
end
我收到此错误...
2) User should be able to order multiple items from menu
Failure/Error: expect(user.place_order("burger", "chips")).to eq(:ordered)
ArgumentError:
wrong number of arguments (2 for 1)
我读到的所有文献都提到这是一种吸收多个论点的方法。
万一你想知道place_order中调用的另一个方法,这就是它的外观......
def receive_order(*items)
raise "Sorry not in stock" if @menu.key?(*items) == false
@bill << items
:ordered if @menu.fetch(*items)
end
非常感谢!
答案 0 :(得分:1)
问题在于您的receive_order
方法;它将多个参数传递给key?
方法。 key?
方法只需要一个参数。
@menu.key?(*items) # wrong
将其更改为:
# change the "all?" to "any?" if just one will do
# if you want to check existence of key:
items.all?{ |key| @menu.has_key?(key) }
# if you want to check existence of value:
items.all?{ |val| @menu.key?(val) } # change if key can be `nil` or `false`
此外,在同一方法中,您在具有多个参数的哈希上调用fetch
并在条件中使用返回值。我不确定你想用这个完成什么。
以下是fetch
的行为方式:
hash = {one: 1, two: 2}
hash.fetch(:one) #=> returns value of :one i.e. 1
hash.fetch(:two, :one) #=> seemingly returns first value found i.e. 2
hash.fetch(:three) #=> raises KeyError for absent keys
hash.fetch(:three, 3) #=> return the second passed argument if key is absent
hash.fetch(:three, 3, :four) #=> Error: wrong number of arguments (3 for 1..2)
在您的方法中,我相信您要检查fetch
是否存在密钥。如果是这样,那么您可以实现类似于我在此响应开始时共享的代码。