Techioz Blog

Ruby のメソッド名の制限は何ですか?

概要

たとえば、メソッド名「bundler?」を見つけました。次のスニペットでは、? かどうかはわかりません。文字は特殊なキーワード、またはメソッド名の一部です。

# This is a predicate useful for the doc:guides task of applications.
def bundler?
  # Note that rake sets the cwd to the one that contains the Rakefile
  # being executed.
  File.exists?('Gemfile')
end

解決策

Ruby のメソッド名には、大文字、小文字、数字、アンダースコア _、句読点記号 !、?、= を含めることができます。

メソッド名を数字や文字 !、? で始めることはできません。と = は最後にのみ指定できます。

メソッド名に非 ASCII 文字を使用することもできますが、これは非常に混乱を招く可能性があるため、一般的に使用すべきではありません。

Ruby では大文字で始まる名前は定数であるため、メソッド名を小文字で始めることをお勧めします (必須ではありません)。メソッドに定数名を使用することは引き続き可能ですが、インターピーターは名前を定数として検索するため、かっこなしでメソッドを呼び出すことはできません。

def Capital
    nil
end

Capital    # NameError: uninitialized constant Capital
Capital()  # => nil

メソッド名を定義する際に、非常に広く一貫して使用されている規則は次のとおりです。

Ruby では、メソッド名として演算子記号を使用して演算子を定義することもできます。

╔═══════════════════════════╦═════════════════════════════════════════════╦═══════╗
║ Operators (by precedence) ║                 Operations                  ║ Arity ║
╠═══════════════════════════╬═════════════════════════════════════════════╬═══════╣
║ ! ~ +                     ║ Boolean NOT, bitwise complement, unary plus ║     1 ║
║                           ║ (define with method name +@, Ruby 1.9+)     ║       ║
║                           ║                                             ║       ║
║ **                        ║ Exponentiation                              ║     2 ║
║                           ║                                             ║       ║
║ -                         ║ Unary minus (define with method name -@)    ║     1 ║
║                           ║                                             ║       ║
║ * / %                     ║ Multiplication, division, modulo            ║     2 ║
║                           ║                                             ║       ║
║ + -                       ║ Addition, subtraction                       ║     2 ║
║                           ║                                             ║       ║
║ << >>                     ║ Bitwise shift                               ║     2 ║
║                           ║                                             ║       ║
║ &                         ║ Bitwise AND                                 ║     2 ║
║                           ║                                             ║       ║
║ | ^                       ║ Bitwise OR, Bitwise XOR                     ║     2 ║
║                           ║                                             ║       ║
║ < <= => >                 ║ Ordering                                    ║     2 ║
║                           ║                                             ║       ║
║ == === != =~ !~ <=>       ║ Equality, pattern matching, comparison      ║     2 ║
╚═══════════════════════════╩═════════════════════════════════════════════╩═══════╝

単項演算子メソッドには引数は渡されません。二項演算子メソッドには引数が渡され、その引数とそれ自身に対して動作します。

演算子のアリティに厳密に従うことが重要です。異なる引数を持つ演算子メソッド (たとえば、2 つの引数を取る + メソッド) を定義することは可能ですが、Ruby では演算子構文でメソッドを呼び出すことはできません (ただし、ドット構文では機能します)。

演算子の元のセマンティクスにできる限り従うことをお勧めします。演算子の元の意味を知っている人にとっては、それがユーザー定義クラスでどのように機能するかが直感的に理解できるはずです。

この言語は、通常、配列およびハッシュ値にアクセスするために使用される特別な非演算子 ,[] メソッドの糖衣構文も提供します。 [] メソッドは任意の引数で定義できます。

順序付け、等価性、比較、パターンマッチングを除く、表内のすべての二項演算子について、Ruby は省略された代入の省略表現も提供します (たとえば、x += y は x = x + y に展開されます)。これらをメソッドとして定義することはできませんが、その動作の基礎となる演算子を定義して動作を変更することはできます。

これらの文字はいずれも、通常のメソッド名内では使用できません (たとえば、do&print や start-up は有効なメソッド名ではありません)。