1

Ruby on Rails には、ac のような小さなマクロがいくつかあることに気付きました。

__FILE__ and __LINE__

例えば。これにより、一意のキャッシュ キーのデバッグと生成がはるかに簡単になります。

store = Rails.cache.fetch("#{__FILE__}|#{__LINE__}|#{self.store_id}")... 

特定の注文セットに対して同じ店舗を何度も入手する可能性が高い場合に最も便利です。

私が不思議に思っているのは; 独自のマクロ/定義を作成できますか? プリコンパイルされたコードは、時には良いアイデアではありませんが、その場所があります。

質問: Ruby/Rails で C スタイルのマクロを作成する方法はありますか?

4

2 に答える 2

4

それらは C のように見えますが、マクロではありません。Ruby の他のすべてのものと同様に、これらは単なるオブジェクトであり、特に現在解釈されているファイルの名前と行番号を決定する力があります。

C マクロは、コンパイル時の実行可能コードへの単なる参照です。Ruby は...まるで、まったく、これとは正反対です :-) Ruby でのコンパイルは、実際には構文評価と解釈です。C、C++、Java などの一部の言語が早期バインディングであり、PHP や Python などの他の言語が遅延バインディングである場合、ruby はバスに乗り遅れており、可能な限り最後の瞬間に到達します。

したがって、独自のものを作成したい場合は、内部に何かを含むモジュールおよび/またはクラスを作成してください。内部で作成するのは、変数、シンボル、定数、またはメソッド (おそらくローカル) で、インスタンスまたはクラス (おそらくパブリック、プロテクト、またはプライベート) です。通常、特別な命名規則__FOO__やその他の規則を使用するのは適切ではありません (それらが有効な名前であっても)。

(答えの終わり...あなたが求めていることを聞いているなら、おそらくこれはあなたが必要な精神的な飛躍を遂げるのに役立つでしょう)...

C から C++、Java、そして Ruby に移行しました。改革派 Java プログラマーのためのクリニックでしばらく過ごした後、私は ruby​​ がいかに驚くほど強力であるかを理解することができました。しかし、問題を別の方法で解決する方法を本当に考える必要があります。

Eloquent Rubyという本を強くお勧めします。ここから Amazon にリンクされています。

于 2012-11-29T02:15:08.147 に答える
2

__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++ マクロが提供するものと同様の (場合によってはそれ以上の) レベルの表現力を実現できます。

于 2012-11-29T02:43:03.010 に答える