簡體   English   中英

在類定義期間添加實例方法

[英]Adding instance methods during class definition

我目前正在開發我的第一個寶石,並在元編程方面取得了初步經驗。

因此,我希望獲得一些有關如何在類定義期間正確定義實例方法的反饋。

具體來說,我創建了此模塊,您應該將其extend到ActiveRecord模型中,如下所示:

class Duck < ActiveRecord::Base
  extend UnitedAttributes::Model
  attr_accessible :name, :weight
  unite :weight, :kilogram
end

這是UnitedAttribues::Model模塊的源代碼。 https://github.com/nielsbuus/united_attributes/blob/master/lib/united_attributes/model.rb

這是沒有多余代碼的簡化版本:

module UnitedAttributes
  module Model

    def unite(accessor, unit, options = {})    
      class_eval do
        define_method "united_#{accessor}" do
          Attribute.new(self.send(accessor), options)
        end
      end
    end

  end
end

它似乎有效,但我有一些擔憂:

  1. class_eval是在此處使用的正確方法嗎?
  2. define_method是在此處使用的正確方法嗎?
  3. 選項哈希將傳遞到類方法中,並在實例方法主體內使用。 這樣安全嗎? 有記憶問題嗎?

如果您可以使用ActiveSupport :: Concern ,那將是一種標准化的方式。

如果沒有,您總是可以做類似的事情。

我不會擔心內存問題。 一般來說,哈希很小。 我擔心的是,如果傳遞這些選項的調用者不知道您會堅持使用它們。 例如:

options = { :foo => 'var', :bar => 'example' }

unite :name_1, :unit_a, options

options.delete(:example)

unite :name_2, :unit_b, options

在這種情況下,對options哈希的修改會無意中影響到兩者。 解決此問題的辦法是dupclone傳入的選項,或更好,挑出你想要的值,如果接收到未知的爭論引發異常。 options哈希不應該視為unite方法的屬性。

如果呼叫者傳入一組frozen的選項,您還將遇到麻煩。 您的merge!電話merge! 會產生異常。 通常,除非將方法專門用於執行此類功能,否則將操作傳遞給方法的參數視為無效形式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM