2011-06-28 10 views
2

私はかなり単純なDSLに取り組んでおり、より自然に変数を宣言して割り当てたいと考えています。自然な変数割り当てを作成する方法

GlobalMemory.init { 
    val1 5 
    val2 "some string" 
} 

これは、DSLを実行する単純なVMのためのものです。これはこのコードでうまく動作します

class GlobalMemory 
    include Singleton 

    def self.init &blk 
    GlobalMemory.instance.allocate &blk 
    end 

    def method_missing sym,*args, &blk 
    @segments[sym]=args[0] 
    end 

    def allocate &blk 
    self.instance_eval &blk 
    end 
end 

許可する方法はありますかval1=5(and val1 = 5)?私が試してみると、method_missingは起動せず、エラーメッセージも表示されません。

答えて

1

あなたが何か行う場合は、そのままそれが動作します:

GlobalMemory.init { 
    self.val3 = 'value' 
} 

をそれ以外の場合は、ローカル変数の宣言と区別がつかないのです。私は#local_variablesを使用して作業VAR1 =ソリューションを取得しようとして少し周りめちゃめちゃ

GlobalMemory.init { |g| 
    g.val1 5 
    g.val2 "some string" 
    g.val3 = 'yeah' 
} 

、しかし:私はそれを行うためのよりよい方法は、ブロックパラメータを持っており、このようなあなたのinitメソッドを書くことだろうと思いますあなたが見ることができるのは、あなたのブロックの最後にバインディングオブジェクトを返す必要があることがわかります。また、ブロックの前に既に宣言されている変数にはいくつか問題があります。誰かがこれを行うためのより良い方法を提案するかもしれませんか?

1

これを内部DSLとしてはっきりと行うことはできません

関連する問題