私は過去に正常に使用した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_
もう一度、ありがとう。
よろしく