Ruby - 强制method_missing * args是哈希?

时间:2013-09-16 18:17:34

标签: ruby method-missing

我想为我的一个类定义一个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中的参数列表视为哈希?

3 个答案:

答案 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}
]

基本上,键/值对合并为一个哈希并按顺序传递。