我目前正在研究一种探路者算法,而且我使用的是Ruby(RGSS3)语言,我有一个函数 find_path(startx,starty,destx,desty,$ game_player)
可悲的是,它会抛出SyntaxError消息,因为我无法将全局变量作为正式参数传递。
我尝试在调用find_path()函数之前创建一个局部变量(character_position = $ game_player),然后调用different error occurs,因此该函数无法看到变量
前几天我找到了解决这个问题的方法;我之前没有创建character_position变量,但是在find_path()函数内部,它似乎工作,但我不知道如何以及为什么。
工作解决方案:find_path(startx,starty,destx,desty,character_position = $ game_player)
有人可以解释那里发生了什么吗?有更清洁,更优雅的解决方案吗?
答案 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)
这是方法定义,名称startx
,starty
等是方法的参数名称。参数是数据的占位符,稍后将在实际运行find_path
方法时提供。
问题是$game_player
不是参数名称,它是一个实际代表脚本中某些数据的全局变量。 Ruby期待一个名单列表,但你要给它数据!
当你改变它时,意思完全不同:
def find_path(startx, starty, destx, desty, character_position = $game_player)
现在你给它一个参数名character_position
,所以一切都好。 = $game_player
表示运行方法时 ,如果没有为character_position
参数提供数据,则会使用$game_player
。