Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

arityメソッドで必要な引数を調べる

Methodクラスのインスタンスメソッド(書いてて意味分からなくなりますが)に、
arityという便利なものがあります。
これは、メソッドが持つ引数を返してくれるスグレモノです。
(*N)のような、複数個持つ系のものは-1を返します。

本文のサンプルそのまんまの例を挙げますと

class C
  def u;               end
  def v(a);            end
  def w(*a);           end
  def x(a, b);         end
  def y(a, b, *c);     end
  def z(a, b, *c, &d); end
end

c = C.new
p c.method(:u).arity     #=> 0
p c.method(:v).arity     #=> 1
p c.method(:w).arity     #=> -1
p c.method(:x).arity     #=> 2
p c.method(:y).arity     #=> -3
p c.method(:z).arity     #=> -3

既存メソッドでも、当然できます。

> 42.methods
#=> [:to_s, :-@, :+, :-, :*, :/, :div, :%, :modulo, :divmod, :fdiv, :**, :abs, :magnitude, :==, :===, :<=>, :>, :>=, :<, :<=, :~, :&, :|, :^, :[], :<<, :>>, :to_f, :size, :zero?, :odd?, :even?, :succ, :integer?, :upto, :downto, :times, :next, :pred, :chr, :ord, :to_i, :to_int, :floor, :ceil, :truncate, :round, :gcd, :lcm, :gcdlcm, :numerator, :denominator, :to_r, :rationalize, :singleton_method_added, :coerce, :i, :+@, :eql?, :quo, :remainder, :real?, :nonzero?, :step, :to_c, :real, :imaginary, :imag, :abs2, :arg, :angle, :phase, :rectangular, :rect, :polar, :conjugate, :conj, :between?, :nil?, :=~, :!~, :hash, :class, :singleton_class, :clone, :dup, :initialize_dup, :initialize_clone, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :inspect, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :respond_to_missing?, :extend, :display, :method, :public_method, :define_singleton_method, :object_id, :to_enum, :enum_for, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]

> 42.method(:!)
#=> #<Method: Fixnum(BasicObject)#!>

> 42.method(:!).arity
#=> 0

> 42.method(:kind_of?).arity
#=> 1

> 42.method(:abs2).arity
#=> 0

> 42.method(:between?).arity
#=> 2

制御文にも使えます。

case 42.method(:between?).arity
 when 0 then puts '0'
 when 1 then puts '1'
 when 2 then puts '2'
end

#=> 2

参考もと