Rubyのメソッド名

Rubyでメソッドを定義するときに使う def に与えられる識別子のパターンを考えてみることにした。

パターン

自分が見聞したところによると、def に与えられる識別子には以下のパターンがあるらしい。

  • 曰く、識別子の先頭に [0-9] を置いてはならない
  • 曰く、識別子には \w を利用できる
  • 曰く、識別子にはマルチバイト文字を利用しても良い
  • 曰く、識別子の末尾には !, ?, = を付随させても良い

また上のパターンとは独立して、メソッドとして実装されている再定義可能な演算子のために以下の名前が許可されているらしい。

  • -
  • -@
  • !
  • !=
  • !~
  • []
  • []=
  • *
  • **
  • /
  • &
  • %
  • `
  • ^
  • +
  • +@
  • <
  • <<
  • <=
  • <=>
  • ==
  • ===
  • =~
  • >
  • >=
  • >>
  • |
  • ~

これらのパターンをRubyの正規表現で整理してみる。

operators = %w[
  -
  -@
  !
  !=
  !~
  []
  []=
  *
  **
  /
  &
  %
  `
  ^
  +
  +@
  <
  <<
  <=
  <=>
  ==
  ===
  =~
  >
  >=
  >>
  |
  ~
]

method_name_regexp = Regexp.union(
  /(?!\d)(?:\w|[^[:ascii:]])+[!?=]?/,
  *operators
)

/\A#{method_name_regexp}\z/

メソッド定義とメソッド呼び出し

今回は def にのみ着目したが、他にもメソッドを定義するための方法は他にも用意されている。

  • define_method

エイリアスをつくるという方法もあるので一応これも挙げておく。

  • alias
  • alias_method

呼び出し方についても、通常の方法の他に幾つかの方法が用意されている。

  • __send__
  • public_send
  • send

これらに与えられる識別子のパターンは、def に与えられる識別子のパターンとは異なるので注意したい。

参考