如何修复ruby中返回的不匹配对象类型?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何修复ruby中返回的不匹配对象类型?相关的知识,希望对你有一定的参考价值。

我正在使用ruby2d进行开发和应用。

我有一个函数应该返回一个类为“Tile”的对象。

将返回的对象是“tileStone”,当它在函数内部时,它的类是“Tile”(我使用了一些“puts”来打印这些信息)。但是,当它返回main函数时,它将返回“Ruby2D :: Window :: EventDescriptor”对象。为什么?

 def player1turn(grid)
      tileStone  = stoneChose(1,grid)
      puts tileStone.class #here it prints "Ruby2D::Window::EventDescriptor", which is wrong
  end

  def stoneChose(nplayer,grid)
    Window.on :mouse do |event|
      case event.button
      when :left
        grid.movableStone(grid.getPlayer(nplayer)).each do |tileStone|
          if tileStone.contains? event.x, event.y
            puts tileStone.class #here it prints "Tile"
            tileStone

          end 
        end 
      end
    end 
  end
答案

我不熟悉ruby2d,但似乎Window.on只放置一个事件监听器/处理程序,并返回EventDescriptor。接下来,当事件被触发时,将执行on中的代码。因此,您的函数stoneChose只是设置此事件侦听器并返回此描述符类实例。

您可以在这个ruby2d查看Pong game项目的一般架构。简而言之:

1)您必须先设置所有事件监听器

def setup
    Window.on :mouse do |event|
        case event.button
        when :left
        grid.movableStone(grid.getPlayer(nplayer)).each do |tileStone|
            if tileStone.contains? event.x, event.y
                doSmthWithTileStone(tileStone)
            end
        end
    end
end

2)定义一个函数,该函数在每个事件上对找到的对象执行一些操作

def doSmthWithTileStone(tileStone)
    puts tileStone
end

3)并做主app循环

def main
    setup

    update do
        ...
    end
end

main

以上是关于如何修复ruby中返回的不匹配对象类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 C# MOngoDB 中的日期匹配错误

如何跳过查询条件片段中的空对象?

返回 Ruby 正则表达式的第一个匹配项

切换到 64 位 Excel 后如何修复 VBA“类型不匹配”错误

如何修复重叠的片段

缓存的 Ruby Haml 块返回空