ruby 动的に方法を追加する模块

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ruby 动的に方法を追加する模块相关的知识,希望对你有一定的参考价值。

##
# include method module
# @author tatsunori nishikori
module IncludeMethod

  ##
  # include other instance method
  # @note 他のインスタンスのメソッドの一部を自分自身のクラスに動的に追加します
  # @param [Object] instance 追加したいメソッドが有るインスタンス
  # @param [Array] method_names メソッド名(symbol)
  def include_instance_method(instance, method_names)
    @instance = instance
    method_names.each do |method_name|
      self.class.class_eval <<-EOS, __FILE__, __LINE__ + 1
        def #{method_name}(*args)
          @instance.send(:#{method_name}, *args)
        end
      EOS
    end
  end

  ##
  # 動的に自インスタンスのメソッドを削除
  # @param [Array] method_names メソッド名(symbol)
  def remove_instance_method(method_names)
    method_names.each do |method_name|
      if self.class.method_defined?(method_name)
        self.class.class_eval { remove_method method_name }
      end
    end
  end

  ##
  # 動的にアクセサメソッド等が追加出来るメソッド
  # @param [Array] funcs
  # @example dynamic_include_attr_method([ def agree; p 'Hello'; end ])
  def dynamic_include_attr_method(funcs)
    funcs.each do |func|
      self.class.class_eval { func }
    end
  end

  ##
  # hashを動的にattr_readerとして追加し、初期値をセットする
  # @param [Hash] hash
  # @example hash_to_attr_reader_method({ name: 'Bob', age: 31, sex: 1 })
  def hash_to_attr_reader_method(hash)
    hash.each do |k, v|
      self.class.class_eval <<-EOS, __FILE__, __LINE__ + 1
        attr_reader :#{k}
      EOS
      self.instance_variable_set("@#{k}".to_sym, v)
    end
  end

end

以上是关于ruby 动的に方法を追加する模块的主要内容,如果未能解决你的问题,请参考以下文章

csharp DIできる状态で,动的にオブジェクトを生成する(普通にGameObject.Instantiateすると,生成されたオブジェクトにはDIされない))

markdown ActiveRecord的にデフォルト値を设定する

markdown ActiveRecord的地方の句の条件を动的にしたい

sh GitHub的にローカルレポジトリを登录する

sh とりあえず外部への通信を定期的に确认する

sql MySQL的SQLでの外部キー制约を一时的に无效にする