如何解决红宝石返回的对象的不匹配类型?

时间:2019-03-29 14:04:35

标签: ruby

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

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

将返回的对象是“ tileStone”,而在函数内部时,其类是“ Tile”(我已经使用一些“ puts”来打印此信息)。但是,当返回主函数时,它将作为“ 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

1 个答案:

答案 0 :(得分:1)

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

您可以在此Pong game中检查ruby2d项目的一般体系结构。简而言之:

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)并执行主应用循环

def main
    setup

    update do
        ...
    end
end

main