从参数中删除* 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')
答案 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是真正的宝石。在编写自己类似工作的方法之前,请先熟悉它可以做些什么。