我想为我的一个类定义一个method_missing函数,我希望能够传入散列作为参数列表而不是数组。像这样:
MyClass::get_by_id {:id => id}
MyClass::get_by_id {:id => id, :filters => filters}
MyClass::get_by_id {:id => id, :filters => filters, :sort => sort}
据我所知,args列表作为数组传入,因此键被删除,无法分辨哪些参数。有没有办法强制Ruby将method_missing中的参数列表视为哈希?
答案 0 :(得分:3)
你有什么问题?这对我有用:
class MyClass
def self.method_missing name, args
puts args.class
puts args.inspect
end
end
MyClass.foobar :id => 5, :filter => "bar"
# Hash
# {:id=>5, :filter=>"bar"}
答案 1 :(得分:1)
这是你在找什么?
class Foo
def self.method_missing(name,*args)
p args
p name
end
end
Foo.bar(1,2,3)
# >> [1, 2, 3]
# >> :bar
答案 2 :(得分:0)
我正在回答自己的问题,这是基于我自问过以来所做的实验。在arg列表中使用散列splat时,可以传入这样的散列:
MyClass::get_by_id(:id => id, :filters => filters)
参数列表如下所示:
[
{
:id => id,
:filters => filters
}
]
Ruby将键/值对放在位置args [0]的单个哈希对象中。如果你调用这样的方法:
MyClass::get_by_id(id, :filters => filters)
您的参数列表将是:
[
id,
{:filters => filters}
]
基本上,键/值对合并为一个哈希并按顺序传递。