1

以下の比較的単純な割り当てで興味深い問題が発生しています。最初に括弧で囲まれた各チャンクはnilと評価され、割り当てられるべきRubygame::Surface.new値として残されます。@image残念ながら、私が設定した次の行では、がnilであるため、 NoMethodError@rectがスローされます。@image

@image = (image unless image.nil?) or 
         (Rubygame::Surface.autoload(image_file) unless image_file.nil?) or 
         (Rubygame::Surface.autoload("#{@name}.png") unless @name.nil?) or 
         Rubygame::Surface.new([16, 16])
@rect = Rubygame::Rect.new [0, 0], [@image.width, @image.height]

同様のテストがIRBで期待どおりに機能するため、「または」ステートメントは整形式であると確信していますが、他のすべてがnilのときに新しいSurfaceが返されない理由がわかりません。

4

3 に答える 3

5

Rubyのorandandキーワードの優先順位は非常に低くなっています。代入演算子よりもさらに低くなり=ます。||したがって、それらをそれぞれとに置き換えるだけで&&(両方ともより緊密にバインド=されます)、期待どおりに機能するはずです。Rubyの演算子の優先順位はここにリストされています

それに加えて、あなたのコードは非常に密集していると思います。次のようなものにリファクタリングすることを検討してください。これにより、コードの意図がはるかによく伝わると思います。

@image = case
  when image then image
  when image_file then Rubygame::Surface.autoload(image_file)
  when @name then Rubygame::Surface.autoload("#{@name}.png")
  else Rubygame::Surface.new([16, 16])
end

@rect = Rubygame::Rect.new [0, 0], [@image.width, @image.height]
于 2010-09-11T11:16:34.920 に答える
1

さらにレベルの括弧を試しましたか?

@image = ((image unless image.nil?) or 
         (Rubygame::Surface.autoload(image_file) unless image_file.nil?) or 
         (Rubygame::Surface.autoload("#{@name}.png") unless @name.nil?) or 
         Rubygame::Surface.new([16, 16]))
于 2010-09-11T10:00:23.897 に答える
-1

なぜRubyGameを使用しているのですか?Ruby用のGosuゲーム開発フレームワークは、より高速で人気があります。

于 2010-09-12T08:48:03.350 に答える