2015-03-30 39 views
1

在我的程序中,我使用了一個狀態機,並有許多便利方法。我目前正在創建一個長長的「?」列表方法在模型中。元編程Ruby便捷方法

def purchase_ready? 
    self.current_state == 'purchase_ready' 
end 

def completed? 
    self.current_state == 'completed' 
end 

def region_prepared? 
    self.current_state == 'region_prepared' 
end 

什麼是元編程方式來做到這一點?

回答

1

偷懶的方法是使用BasicObject#method_missing

class State 
    def initialize state 
    @state = state 
    end 

    def method_missing name, *args 
    case name 
    when :purchase_ready, :completed, :region_prepared 
     @state == name 
    else 
     super 
    end 
    end 
end 

state = State.new(:purchase_ready) 
state.purchase_ready 
    #=> true 
state.completed 
    #=> false 
state.region_prepared 
    #=> false 
state.purchase_not_ready 
    #-> NoMethodError: undefined method `purchase_not_ready' for 
    # #<State:0x007f9dfb9674b8 @state=:purchase_ready> 
+0

其實我已經得到了> 20個州,分爲名作,所以元編程方法效果。感謝你的回答。 – ardochhigh 2015-03-30 19:22:52

+1

啊,是的。我錯過了「無數」。元編程的另一個優點通常是它可以讓你構造你的代碼,這樣你就可以在模塊中添加,刪除,修改或重命名元素,而不會影響別處的代碼。 – 2015-03-30 19:39:06