首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单的“或”不像预期的那样工作

简单的“或”不像预期的那样工作
EN

Stack Overflow用户
提问于 2010-09-11 09:47:30
回答 3查看 146关注 0票数 1

下面的任务比较简单,我遇到了一个有趣的问题。开头的每个括号大小的块计算值为零,将Rubygame::Surface.new作为应该分配给@image的值。不幸的是,在我设置@rect的下一行中,它抛出一个NoMethodError,因为@image是零。

代码语言:javascript
复制
@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,而其他所有东西都为零。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-11 11:16:34

Ruby中的orand关键字具有非常、非常低优先级的。甚至低于赋值运算符=。因此,只需分别用||&&替换它们(这两个绑定都比=更紧密),它应该会像您预期的那样工作。红宝石的操作符优先在这里列出。

除此之外,我认为您的代码非常密集。考虑将其重构为如下内容,我认为这更好地表达了代码的意图。

代码语言:javascript
复制
@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]
票数 5
EN

Stack Overflow用户

发布于 2010-09-11 10:00:23

你试过更多的括号吗?

代码语言:javascript
复制
@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]))
票数 1
EN

Stack Overflow用户

发布于 2010-09-12 08:48:03

你为什么要使用RubyGame?Ruby的高苏游戏开发框架更快,更受欢迎。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3690508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档