1

クラスの 1 つに 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}

私の知る限り、引数リストは配列として渡されるため、キーが削除され、どの引数がどれであるかを知る方法がありません。Ruby に method_missing の引数リストをハッシュとして扱わせる方法はありますか?

4

3 に答える 3

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"}
于 2013-09-16T19:23:20.550 に答える
1

これはあなたが探しているものですか?

class Foo
    def self.method_missing(name,*args)
        p args
        p name
    end
end

Foo.bar(1,2,3) 
# >> [1, 2, 3]
# >> :bar
于 2013-09-16T18:21:58.560 に答える
0

質問してから行った実験に基づいて、自分の質問に答えています。引数リストでハッシュ スプラットを使用する場合、次のようなハッシュを渡すことができます。

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

基本的に、キーと値のペアは 1 つのハッシュにマージされ、順番に渡されます。

于 2013-09-16T19:25:42.223 に答える