为什么在参数

时间:2017-10-01 22:43:38

标签: ruby

从参数中删除* splat时,该功能正常。但是当它在那里时功能不起作用。为什么?请参阅我的repl(https://repl.it/LuY8/4

class Hash
  def keys_of(*arguments)
    new_array = []
    self.each do |key, value|
      #puts arguments
      #puts key
      if value == arguments
        new_array << key 
      end
    end
    new_array
  end
end

animals = {"sugar glider"=>"Australia","aye-aye"=> "Madagascar","red-footed tortoise"=>"Panama","kangaroo"=> "Australia","tomato frog"=>"Madagascar","koala"=>"Australia"}

animals.keys_of('Madagascar')

1 个答案:

答案 0 :(得分:2)

这是 varargs 方法签名,arguments 总是是一个数组,即使对于奇异值也是如此。这意味着您将['Madagascar']作为arguments并且由于您的密钥不是单个字符串的数组,因此您的匹配失败。

你可能想要的是通过这样做来反转整个例程并使其更像Ruby:

def keys_of(*arguments)
  each_with_object([ ]) do |(key, value), a|
    a << key if (arguments.include?(value))
  end
end

问题解决了。 Ruby拥有一个非常丰富且功能强大的核心库,Enumerable是真正的宝石。在编写自己类似工作的方法之前,请先熟悉它可以做些什么。