0

私はそれを作ることができるかどうか疑問に思っていたので、私が次のようなものを持っていれば

class Test

  attr_reader :access_times
  def initialize
    @access_times = 0
  end

  def get_two
    2
  end

  ...
end

t = Test.new

にアクセスするtと、実際にメソッドを実行する前に特定のコードが実行されますか?

たとえば、突然、と言うことにした場合、構文t.get_twoを使用したという事実は1ずつインクリメントされます。または、チェックを行った場合も1ずつインクリメントされます。によって継承されたメソッドまたは属性にアクセスすると、変数も1インクリメントされます。 。.@access_timest.is_a?(Test)@access_timesTest

.基本的に、可能であれば構文にいくつかのものを追加したいと思います。

私はこれが良いコードなのか悪いコードなのかを尋ねているのではなく、それが可能かどうか、そしてそれがどのように行われるのかを尋ねています。すべてのメソッドにインクリメントロジックを手動で追加し、すべての直接インスタンス変数アクセスをメソッドに置き換えることができるため、通常は使用しません(などis_a?から継承されたものもObject

4

3 に答える 3

0

これがあなたの説明による回避策です。基本的に、インスタンスメソッドごとに@access_timesが増分され、メソッドは以前と同じように動作します。

class Test
  attr_accessor :access_times

  def initialize
    @access_times = 0
  end

  def get_two
    2
  end
end

class Test
  @@im = instance_methods

  @@im.each do |m|
    class_eval <<-END
      alias temporary #{m}
    END

    define_method(m) do |*args, &block|
      @access_times += 1
      temporary(*args, &block)
    end
  end

  undef :temporary
end

Test.new.get_two # => @access_times += 1 and original get_two is called: 2

このコードは期待どおりに機能しませんが、後で説明します。ありがとう。

于 2012-08-08T06:49:09.297 に答える
0

すべてをスタンドアロンにする必要がない場合は、単に拡張することをお勧めしますActiveModel::Callbacks。クラスを拡張するだけで、Rails の他のすべてのものを必要とせずに、before_filter のすべての機能を使用できます。

于 2012-08-07T19:30:32.873 に答える
0

かなりハードコアなバージョンを使用することになりますset_trace_func: http://apidock.com/ruby/Kernel/set_trace_func

これにより、プログラム全体で発生するすべての ruby​​ イベントをサブスクライブできます。これは大量の呼び出しになる可能性があります...

任意のメソッド呼び出しに登録するための組み込みフックがあるとは思いません。メソッド欠落、メソッドチェーン、または委任を使用して何かを実装できますが、それは要件によって異なります。

于 2012-08-07T19:37:35.763 に答える