私はテキスト ゲーム エンジンに取り組んでおり、探索モジュールの開発中に問題が発生しました。Location
フィクスチャからブロック引数を使用してクラスをインスタンス化しようとすると、次のエラーが発生します。
ArgumentError、「引数の数が間違っています (2 に対して 3)
このコードの場合:
# in lib/explore/models/location.rb, line 15
class Location < RoundTable::Controllers::ActionDelegate
# ... code omitted for brevity
def initialize(slug, params = nil, &block)
# ... code omitted for brevity
if block_given?
parser = Explore::Parsers::LocationParser.new(self)
parser.instance_eval &block
end # if
end # constructor
# ... code omitted for brevity
end # class Location
# in spec/fixtures/models/locations.rb, line 38
location :mushroom_kingdom, :name => "Mushroom Kingdom" do
edges = Explore::Fixtures[:edges]
edges.each do |key, value|
go value.location, *value.params
end # each
end # location
# in spec/models/location_spec.rb, line 193
context "initialized with block" do
let :fixture do fixtures[:mushroom_kingdom] end
subject { described_class.new fixture.slug, fixture.params, &fixture.block }
it { puts subject.inspect }
end # context initialized with block
ブロックが proc に変換されない、またはその逆の構文エラーであることは明らかですが、コードを何十回も調べましたが、見つかりません。イーグルアイの読者が私を助けてくれるなら、私は永遠に感謝します.
ソース ファイル:
完全なソースは Github で入手できますが、2 つのリポジトリに分割されています。
コードまたは仕様を実行するには、プラグイン コードを vendor/modules/plugins/explore のエンジン ディレクトリ内に配置する必要があります。
バックトレース:
1) RoundTable::Vendor::Plugins::Explore::Models::Location initialization with block
Failure/Error: it { expect { described_class.new fixture.slug, fixture.params, &fixture.block }.not_to raise_error ArgumentError }
expected no ArgumentError, got #<ArgumentError: wrong number of arguments (3 for 2)>
# ./spec/models/location_spec.rb:33:in `block (4 levels) in <top (required)>'
2) RoundTable::Vendor::Plugins::Explore::Models::Location initialized with block
Failure/Error: subject { described_class.new fixture.slug, fixture.params, &fixture.block }
ArgumentError:
wrong number of arguments (3 for 2)
# ./lib/explore/parsers/location_parser.rb:39:in `go'
# ./spec/fixtures/models/locations.rb:41:in `block (2 levels) in <module:Models>'
# ./spec/fixtures/models/locations.rb:40:in `each'
# ./spec/fixtures/models/locations.rb:40:in `block in <module:Models>'
# ./lib/explore/models/location.rb:49:in `instance_eval'
# ./lib/explore/models/location.rb:49:in `initialize'
# ./spec/models/location_spec.rb:196:in `new'
# ./spec/models/location_spec.rb:196:in `block (3 levels) in <top (required)>'
# ./spec/models/location_spec.rb:198:in `block (3 levels) in <top (required)>'
編集 2012年06月06日:
- サンプルコードを実際の非準拠コードに置き換えました
- プロジェクト全体へのリンクを追加