参数数目错误使用* splat operator ruby​​时出错

时间:2014-12-28 13:23:43

标签: ruby tdd

我正在尝试使用此方法的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

非常感谢!

1 个答案:

答案 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是否存在密钥。如果是这样,那么您可以实现类似于我在此响应开始时共享的代码。