__FILE__
__LINE__
マクロそのものではなく、キーワード (値を返すものString
) です。
そうは言っても、アンダースコアまたは_
文字で始まる定数とメソッドを定義できます。例えば:
__MICKEY__ = :mouse
これで、定数は、文字列、式、さらにはコード ブロック (Proc
またはlambda
) または全体など、あらゆるものを参照できますClass
。
つまり、コンパイル時のマクロ展開 (Ruby はインタープリター言語であるため、実際には「コンパイル フェーズ」がありません) の代わりに、(おそらくより強力な) 実行時のコード実行を利用できます。
たとえば、C++ マクロは次のようになります。
#define SUM(a, b, c) a + b + c
Ruby では次のように適切に近似できます。
def SUM(a, b, c); a + b + c; end
a) この場合、定数やマクロではなくmethodを定義しているため、b) C++ マクロは、予想とは異なる数の引数で評価された場合でも機能します (C++ マクロは展開されているため)。 、つまり、検索して置換したかのように)、メソッドや引数のアリティのチェックなど、Ruby のメソッド呼び出しセマンティクスが機能します。
それを回避するために、私たちの特定の例では、できることがあります (間違いなくもっと柔軟なこと)。
def SUM(*args); args.inject(:+); end
SUM(1, 2) # => 3
SUM(1, 2, 3, 5) # => 11
ご覧のとおり、Ruby の動的な性質を活用することで、C++ マクロが提供するものと同様の (場合によってはそれ以上の) レベルの表現力を実現できます。