我在下面相对简单的分配中遇到了一个有趣的问题。开头的每个带括号的块都评估为nil,留下应该分配Rubygame::Surface.new
的值。@image
不幸的是,在我设置的下一行@rect
,它抛出NoMethodError因为@image
是nil。
@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 运行,按预期工作,所以我很确定 'or' 语句格式正确,但我无法弄清楚为什么它没有返回新的 Surface 而其他一切都是nil。