形式论证不能成为全局变量

时间:2018-02-21 17:54:46

标签: ruby algorithm pathfinder

我目前正在研究一种探路者算法,而且我使用的是Ruby(RGSS3)语言,我有一个函数 find_path(startx,starty,destx,desty,$ game_player)

  • startx:起始位置的X坐标
  • starty:起始位置的Y坐标
  • destx:所需位置的X坐标
  • desty:起始位置的Y坐标
  • $ game_player:播放器当前的X和Y坐标

可悲的是,它会抛出SyntaxError消息,因为我无法将全局变量作为正式参数传递。

我尝试在调用find_path()函数之前创建一个局部变量(character_position = $ game_player),然后调用different error occurs,因此该函数无法看到变量

前几天我找到了解决这个问题的方法;我之前没有创建character_position变量,但是在find_path()函数内部,它似乎工作,但我不知道如何以及为什么。

工作解决方案:find_path(startx,starty,destx,desty,character_position = $ game_player)

有人可以解释那里发生了什么吗?有更清洁,更优雅的解决方案吗?

2 个答案:

答案 0 :(得分:1)

你在这里有什么:

 find_path(startx, starty, destx, desty, character_position = $game_player)

$game_player被设置为参数的默认值。如果为第五个参数传递不同的值,则将使用它。如果省略第五个参数,将使用默认值(全局)。请记住,未赋值的全局变量在引用时不会引发NoMethodError,因此如果您没有定义全局但不传递第五个参数,则函数中的值将为nil。

如果您不想允许character_position的自定义值,则可以删除该参数,并直接从函数体中引用$game_player

一般来说,如果你可以帮助它,避免使用很多全局变量是一个好主意,但是如果没有看到更多代码,就很难就此提出建议。

答案 1 :(得分:0)

我猜你没有显示所有的代码,你真正拥有的是:

def find_path(startx, starty, destx, desty, $game_player)

这是方法定义,名称startxstarty等是方法的参数名称。参数是数据的占位符,稍后将在实际运行find_path方法时提供。

问题是$game_player不是参数名称,它是一个实际代表脚本中某些数据的全局变量。 Ruby期待一个名单列表,但你要给它数据!

当你改变它时,意思完全不同:

def find_path(startx, starty, destx, desty, character_position = $game_player)

现在你给它一个参数名character_position,所以一切都好。 = $game_player表示运行方法时 ,如果没有为character_position参数提供数据,则会使用$game_player