2017-09-12 6 views
0

私は過去に正常に使用したpatternに基づいてDSLを作成しています。私はこれがボックスの外で動作すると思ったが、私はちょうど把握することができないエラーが発生しているので、任意の助けに感謝します。ここinstance_evalまたはblock.callを使用して引数の数に問題があるDSLクラスの初期化

試験を追加するための方法であって、ここで

module PPEKit 
    module Tests 
    def add_test(id, &block) 
     @_tests ||= {} 
     @_tests[id] = Test.new(id, &block) unless @_tests.include? id 
    end 
    end 
end 

は、Testクラスの定義である:

module Tests 
    class Test 
     attr_accessor :id, :description, :conditions, :platforms 

     def initialize(id, &block) 
     @id = id 
     (block.arity < 1 ? (instance_eval(&block)) : block.call(self)) if block_given? # ERROR occurs here 
     end 
    end 
    end 

テストモジュールがようPPEKit ::製品のクラスに含まれている:

module PPEKit 
    class Product 
    include Tests 

instance_evalでエラーが発生するため、私はmethod_missingを表示しませんコール。私は同じ結果とブロックアリティの両方のタイプを使用して、テストオブジェクトを初期化しようとしている:

add_test :my_test_id do 
     description 'my test description' 
     conditions [:minvdd, :maxvdd, :bin1_1300Mhz, :bin2_1200Mhz] 
     platforms [:v93k, :j750] 
     meta1  'dkwew' 
     meta2  'jkjejkf' 
    end 

    add_test :my_test_id do |t| 
     t.description 'my test description' 
     t.conditions [:minvdd, :maxvdd, :bin1_1300Mhz, :bin2_1200Mhz] 
     t.platforms [:v93k, :j750] 
     t.meta1  'dkwew' 
     t.meta2  'jkjejkf' 
    end 

は、上記の定義の両方が次のエラーを与える:ここ

COMPLETE CALL STACK 
    ------------------- 
    wrong number of arguments (given 1, expected 0) 
    /users/user/origen/ppekit/lib/ppekit/test_list.rb:6:in `block in instantiate_tests' 

は、TestクラスにPEEKであります前に呼び出してinstance_evalを呼び出す:

[1] pry(#<PPEKit::Tests::Test>)> id 
    => :my_test_id 
    [2] pry(#<PPEKit::Tests::Test>)> self 
    => #<PPEKit::Tests::Test:0x002b42673ab158> 
    [3] pry(#<PPEKit::Tests::Test>)> cd self 
    [4] pry(#<PPEKit::Tests::Test>)> block.arity 
    => 0 
    [5] pry(#<PPEKit::Tests::Test>)> block 
    => #  <Proc:[email protected]/users/user/origen/ppekit/lib/ppekit/test_list.rb:5> 
    [6] pry(#<PPEKit::Tests::Test>):1> ls 
    PPEKit::Tests::Test#methods: 
     conditions conditions= description description= id id= method_missing platforms platforms= 
    self.methods: __pry__ 
    locals: _ __ _dir_ _ex_ _file_ _in_ _out_ _pry_ 

もう一度、ありがとう。

よろしく

答えて

1

あなたは、description(arg)を持っていないだけでゲッターdescription()とセッターdescription=(arg)。そして、あなたがdescription 'my test description'を実行するとき、それは期待していない引数でゲッターを呼び出し、wrong number of arguments (given 1, expected 0)を取得します。

チュートリアルでは、attr_accessorではなく、通常の方法を使用しています。

あなたはdescription=を使用したり、コードを変更することができます:

module PPEKit 
    module Tests 
    def add_test(id, &block) 
     @tests ||= {} 
     @tests[id] = Test.new(id, &block) 
    end 

    class Test 
     def initialize(id, &block) 
     @id = id 
     @description = nil 
     block.arity < 1 ? instance_eval(&block) : block.call(self) 
     end 

     def description(description) 
     @description = description 
     end 
    end 
    end 
end 

include PPEKit::Tests 

add_test :create_article do 
    description 'creating article' 
end 

add_test :delete_article do |t| 
    t.description 'deleting article' 
end 

puts @tests 
# {:create_article=>#<Test:0x00000000d91ac0 @id=:create_article, @description="creating article">, 
# :delete_article=>#<Test:0x00000000d919d0 @id=:delete_article, @description="deleting article">} 
関連する問題