8

私は現在、Ruby と Rails の実験を行っており、メタプログラミングに関するチュートリアルや書籍のいくつかのセクションにアクセスしました。これは Ruby の不可欠なコンポーネントであると多くの人が言及していますが、詳細には触れていません。あたかも Ruby プログラマーにとってメタプログラミングが最後のフロンティアであるかのようです。.NET のバックグラウンドを持っているため、なぜこれが有用であると思われるのか理解に苦しんでいます。

  • メタプログラミングを使用すると、どのような利点が得られますか?
  • 固有クラスとは何ですか? シングルトンとはどう違うのですか?
  • どのような状況でメタプログラミングを使用するのが一般的ですか?
  • コードを使用して他のコード、特に自分のものではないコードの動作を変更することには、どのような倫理的影響がありますか?
4

2 に答える 2

17
  • メタプログラミングを使用すると、どのような利点が得られますか?

    それがない場合よりも表現力豊かな API を作成できます (たとえば、ActiveRecord はメタプログラミングを使用して、テーブルの列名に基づいてアクセサー メソッドを定義するため、のようなものではperson.ageなく、 のようなものを書くことができます。 )、そうでない場合よりも大幅に少ないコードでいくつかのことを達成できます。person.read_attribute("age")personpeopleage

  • 固有クラスとは何ですか? シングルトンとはどう違うのですか?

    「固有クラス」と「シングルトン クラス」という用語は、Ruby のコンテキストでは同じ意味で使用されます。

  • どのような状況でメタプログラミングを使用するのが一般的ですか?

    ボイラー プレート コードが大量にある場合や、DSL を作成する場合。

    使用例 1:

    次のような定型コードを書く代わりに:

    class Foo
      def bar
        @bar
      end
    
      def bar=(b)
        @bar = b
      end
    
      def baz
        @baz
      end
    
      def baz=(b)
        @baz = b
      end
    end
    

    メタプログラミング メソッド を使用して、このはるかに短いコードを記述できます。このattr_accessorメソッドは、指定した引数に基づいた名前でゲッター メソッドとセッター メソッドを自動的に定義します。

    class Foo
      attr_accessor :foo, :bar
    end
    

    標準ライブラリにまだ存在しない場合attr_accessorは、次のように自分で定義できます (Ruby でのメタプログラミングがどのようなものかを理解するため):

    class Module
      def attr_accessor(*variable_names)
        variable_names.each do |variable_name|
          define_method( variable_name ) do
            instance_variable_get( "@#{ variable_name }" )
          end
    
          define_method( "#{ variable_name }=" ) do |value|
            instance_variable_set( "@#{ variable_name }", value)
          end
        end
      end
    

    終わり

  • コードを使用して他のコード、特に自分のものではないコードの動作を変更することには、どのような倫理的影響がありますか?

    なし。

于 2011-08-23T07:38:20.127 に答える
5

メタプログラミングには時と場所があります。Ruby の本で頻繁に言及されていると思います。なぜなら、人々は Ruby でできることを他の言語ではできないことを自慢したいからです。

メタプログラミングとは、「バーガー」や「ヌードル スープ」の日本語を知らなくても、「これをください」の日本語を知っていて、メニューの項目を指さすことができるようなものです。これにより柔軟性が向上しますが、何が行われているかを正確に知るには、より多くのコンテキストが必要です。

を可能にする ActiveRecord を作成している場合find_by_foo、メタプログラミングは理にかなっています。

zombie-chaserなどの変異テスト ライブラリや、 Small Eigen Colliderなどの Ruby のさまざまな実装をテストする特性評価テスト アプリケーションを作成している場合は、メタプログラミングが理にかなっています。

ただし、アプリケーションを作成している場合は、通常、メタプログラミングではなく、単にプログラミングする必要があります。たとえば、instance_variable_setアプリケーションで使用している場合、それはあなたがどれだけ熟練しているかを示すというよりも、コードのにおいです。

関連する質問として、https://stackoverflow.com/questions/1236191/what-will-i-learn-from-metaprogramming-rubyRuby メタプログラミングのオンライン チュートリアルMetaprogramming how much is too much? があります。.

「Metaprogramming Ruby」という本は、メタプログラミングだけでなく、Ruby のしくみについても教えてくれるので、本当にお勧めです。

于 2011-08-23T23:35:22.113 に答える