-1

私はテキスト ゲーム エンジンに取り組んでおり、探索モジュールの開発中に問題が発生しました。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日:

  • サンプルコードを実際の非準拠コードに置き換えました
  • プロジェクト全体へのリンクを追加
4

3 に答える 3

2

rspecは、完全には役に立たない方法でバックトレースを飲み込むことがあります(-bオプションを使用してこれを抑制することができると思います)-エラーは(私が思うに)他の場所にあります。

私がコードを読んだところ、キノコ王国のブロックは、Explore::Parsers::LocationParser

このクラスはそのgoようなメソッドを定義します

def go(location, params = {})

しかしキノコ王国は

go value.location, *value.params

ここvalue.paramsで、はエッジフィクスチャファイルの下部にエッジを作成するために使用されるオプションのハッシュです。少なくとも1つのケースでは、そのハッシュには2つのオブジェクトが含まれているため、スプラットするgoと3つの引数で呼び出すことになります。goそれが2番目の引数としてハッシュをとるように見えることを考えると、その感嘆符は本当に意図的なものでしたか?

于 2012-06-07T00:06:25.913 に答える
0

試す:

Location.new(fixture[:slug], fixture[:params], fixture[:block])
于 2012-06-06T17:31:12.440 に答える
0

これはあなたが持っているもののレプリカであり、機能します。まだ問題を探しています。

class Location
   def initialize(slug, params = nil, &block)
     yield
   end
end


mushroom_kingdom = 'mushroom kingdom'
fixture = {
  :slug => mushroom_kingdom,
  :params => { :princess => :toadstool },
  :block => lambda { puts "It'sa me, Mario!" }
}
l = Location.new(fixture[:slug], fixture[:params],&fixture[:block])

同じエラーを取得するには、Location.new(fixture[:slug], fixture[:params], 'abcd', &fixture[:block])またはを実行する必要がありLocation.new(fixture[:slug], fixture[:params],fixture[:block])ます。your&が実際にはアンパサンドではないかのようです。他の文字エンコーディングですか?最初の 2 つのパラメーターのいずれかにコンマが含まれていますか?

そして、エラーがまさにこのコードから来ていると確信していますか? あなたが共有したものには構文エラーはありません。

于 2012-06-06T17:33:18.883 に答える