2016-10-30 13 views
0

tという変数を他のメソッドで使用しようとしています(initialize)。 これは、タームのための私のクラスである:他のメソッドで初期化された変数をAASMで使用する

class Term 
    include AASM 

    attr_accessor :t 

    def initialize(term) 
    @t = term 
    puts self.t 
    end 

    aasm do 
    state :Initialized, :initial => true 
    state :OrthographyChecked 

    event :Orthography do    
     puts "Check Orthography" 

     # use @t variable here 

     transitions :from => :Initialized, :to => :UniquenessChecked 
    end 

    # .. more events 

    end 

end 

term = Term.new("textstring") 

私は新しいインスタンスを作成しますが、印刷されたテキストの順序は、私が期待するものではありません。私が取得:

Check Orthography #from Orthography event 
textstring #from initialize method 

initializeメソッドは、私がaasm do eventsの他の方法でも、変数@tを使用する場合は、最後の発射された理由を私は理解していません。 @tnilまたはt method not foundにすることなく、どうすればいいですか?

+0

「@ t」にアクセスする必要があるのはなぜですか?条件に値を使用したいのですか(例えば遷移が起こることが許されている場合など)、何らかの計算を行うためにその値を必要とするのですか?あるいは、遷移の副作用として変更する必要がありますか?イベントの定義の一部として、または特定の遷移のコンテキストで変数を読み取る必要がありますか? – spickermann

+0

'@ t'が有効な文字を持っているかどうかをチェックしたいと思います。だから、私は計算をする必要はありません。 しかし、私は文字列をlowercharsに操作したいと思います。インスタンス定義(文字列)と関連付け(確率のある文字列)のために余分な情報を検索したいと思います。 –

答えて

2

aasmブロックとその状態定義は、クラスのロード時に実行されます。このため、puts "Check Orthography"puts self.tより前に実行される理由です。

状態が実際に設定されているときにコードを実行するには、callbacksを調査するとよいでしょう。私は、次のようにあなたのために働くかもしれない推測:

class Term 
    include AASM 

    attr_accessor :t 

    def initialize(term) 
    @t = term 
    puts "t in initialize: #{t}" 
    end 

    aasm do 
    state :Initialized, :initial => true 
    state :OrthographyChecked 

    event :Orthography do    
     before do 
     puts "Check Orthography" 
     puts "t in Orthography: #{t}" 
     end 

     transitions :from => :Initialized, :to => :UniquenessChecked 
    end 

    # .. more events 
    end 
end 

term = Term.new("textstring") 
term.Orthography 

ところで、それは代わりにキャメルケースの下線method_namesとstate_namesを使用するためにRubyで非常に一般的です。他の開発者と協力して混乱を避けるために、この規約に従うことをお勧めします。

+0

これは 't'変数を' before'で '@t'と'#{t} 'として使用できるようにしますが、それでも最後のメソッドの一つとして' orthography'というイベントが発生します。私は本当に論理的な順序を持つコールバックが必要ですか? –

+0

はい、コールバックが必要です。状態定義(したがって、 'event do ... end'ブロック内のすべてのコード)は、クラスがロードされたときに評価されるため(イベントを発生させたときではありません)、評価されます。イベントが発生したときにコードを実行したいと思います。つまり、コードをコールバックで実行する必要があります。 – spickermann

関連する問題