Techioz Blog

self キーワード引数をリストする Ruby メソッド

概要

キーワード引数をリストするためにメソッドで呼び出すことができるメソッドはありますか?

私が探しているのは次のようなものです

self.keyword_arguments

たとえば、次の例では配列を探しています。

 [:var1, :var2]
def test( var1: true, var2: false)
  self.keyword_arguments
end 

解決策

Ruby では、メソッドはファーストクラスのオブジェクトではありません。メソッドを参照すると、そのメソッドはすでに実行されています。そのため、名前を通じてメソッドを参照するためにシンボルをよく使用します。オブジェクト指向の方法でメソッドを扱うために、Ruby は Method クラスをラッパーとして提供します。メソッドの Method インスタンスを取得したら、それをイントロスペクトする (またはメソッド自体をイントロスペクトさせる) ことができます。

少し複雑ですが、次のようにアプローチします。

def test( var1: true, var2: false)
  method(__method__)
    .parameters
    .filter_map { |k, v| v if k == :key || k == :keyreq }
end

test
#=> [:var1, :var2]

説明:

メソッドの場合、後者は [[:key, :var1], [:key, :var2]] を返します。 :key はオプションのキーワード引数 (デフォルト値を持つ引数) を示します。 :keyreq は必須のキーワード引数 (デフォルト値のない引数) を示しますが、メソッドには引数がありません。

kwargs のような任意のキーワード引数用の :keyrest もあります。 引数名はメソッドによる「内部」専用であり、呼び出し元が追加のキーワード引数を渡すために実際に使用するものではないため、出力には :keyrest は含めていません。

次に、filter_map は、関心のあるキーの値 (つまり、引数名) を返します。