Ruby 形式参数不能是全局变量

Ruby 形式参数不能是全局变量,ruby,algorithm,pathfinder,Ruby,Algorithm,Pathfinder,我目前正在研究一个pathfinder算法,我正在使用Ruby(RGSS3)语言,其中我有一个函数find\u path(startx、starty、destx、desty、$game\u player) startx:起始位置的X坐标 起始位置的Y坐标 destx:所需位置的X坐标 目的地:起始位置的Y坐标 $game_player:玩家当前的X和Y坐标 不幸的是,它抛出了一条消息,因为我不能将全局变量作为形式参数传递 在调用find_path()函数之前,我尝试生成一个局部变量(char

我目前正在研究一个pathfinder算法,我正在使用Ruby(RGSS3)语言,其中我有一个函数find\u path(startx、starty、destx、desty、$game\u player)

  • startx:起始位置的X坐标
  • 起始位置的Y坐标
  • destx:所需位置的X坐标
  • 目的地:起始位置的Y坐标
  • $game_player:玩家当前的X和Y坐标
不幸的是,它抛出了一条消息,因为我不能将全局变量作为形式参数传递

在调用find_path()函数之前,我尝试生成一个局部变量(character_position=$game_player),但之后又生成了一个局部变量,因此该函数无法看到该变量

前几天我找到了解决这个问题的办法;我以前没有做过character\u position变量,而是在find\u path()函数中做的,它看起来很有效,但我真的不知道怎么做,也不知道为什么

工作解决方案:查找路径(startx、starty、destx、desty、角色位置=$game\u player)

有人能解释一下那里发生了什么吗?有更干净、更优雅的解决方案吗

这里有什么:

 find_path(startx, starty, destx, desty, character_position = $game_player)
$game\u player
设置为参数的默认值。如果为第五个参数传递不同的值,则将使用它。如果省略第五个参数,将使用默认值(全局)。请记住,未赋值全局变量不会在引用时引发NoMethodError,因此如果不定义全局变量并且不传递第五个参数,则函数中的值将为零

如果不想允许使用
角色位置的自定义值
,可以删除参数,直接从函数体中引用
$game\u player


一般来说,如果你能帮助的话,避免使用很多全局代码是一个好主意,但是如果没有看到更多的代码,就很难给出建议。

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

def find_path(startx, starty, destx, desty, $game_player)
这是一个方法定义,名称
startx
starty
等是该方法的参数名称。参数是数据的占位符,稍后实际运行
find\u path
方法时将提供这些数据

问题在于,
$game\u player
不是一个参数名,而是一个全局变量,它实际上代表了脚本中的某些数据。Ruby需要一个名字列表,但你给了它数据

当您将其更改为此时,其含义完全不同:

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

现在给它一个参数名
character\u position
,所以一切都正常。
=$game\u player
意味着当方法运行时,如果没有为
字符位置
参数提供数据,则将使用
$game\u player

如果$game\u player是全局的,则不需要将该变量传递到函数或方法中,只需使用它,就会发生与我的错误类似的错误“函数前的局部变量”的情况下,因此函数无法以某种方式看到它。这不是OP的情况。OP有
def find_path(startx,starty,destx,desty,$game_player)
(我推断的是
def
)-不是默认值,只是一个参数。(您的其余答案是准确的。)@jordan阅读整个问题。这是他们的”“工作解决方案”,他们不理解它为什么有效。我明白你的意思。你可能想澄清,你的前几句话不是指OP最初的问题陈述(“它抛出了一个语法错误”),而是指他们在问题后面讨论的内容。请注意,直到(包括)Ruby 1.8中,块参数绑定使用赋值语义,因此块参数可以是赋值左侧合法的任何东西,包括实例变量、类变量、全局变量,甚至setter!在Ruby 1.8中,OP想要做的事情可以通过
define_方法(:find_path)实现{| startx,starty,destx,desty,$game| player |…}
。尽管我仍然不知道为什么会有人想这么做。