Project1

标题: 求教一个脚本问题 [打印本页]

作者: qbjxiaolei    时间: 2012-10-8 14:13
标题: 求教一个脚本问题
RUBY 代码复制
  1. def add_usr_sprite(game_character)
  2.     char=Sprite_Character.new(@viewport1,game_character);
  3.     @character_sprites.push(char);
  4.     return char;
  5.   end
  6.  
  7.   def del_usr_sprite(char)
  8.     char.dispose();
  9.     @character_sprites.delete(char);
  10.   end

然后我按下面方法调用
@char=add_usr_sprite(@game_char);
del_usr_sprite(@char);

会不会出现char.dispose执行的不是数组中的元素的dispose啊,数组中存的是指针还是什么东西哦?求教啊。


‘‘──qbjxiaolei于2012-10-8 14:14补充以下内容:

大哥大姐们,新人求教啊{:4_96:}
’’
作者: zhangbanxian    时间: 2012-10-8 14:16
是指针无误,然后dispose后面不用加括号- -b
作者: qbjxiaolei    时间: 2012-10-8 14:27
谢了!!
作者: 怪蜀黍    时间: 2012-10-8 14:32
这种菜应该没人抢吧?料想一定不会有人的,那么P叔抢了。好饿呀。

先回答主题:char.dispose的确不是数组中的元素的dispose

这里有问题哈,add_usr_sprite(game_character)的返回值是return char,而不是数组@character_sprites的某个元素!

因此:
这时@char是Sprite_Character.new(@viewport1,game_character),不是数组哦。
这时@character_sprites是[@char]

你再del_usr_sprite(char),形参char是被@char所代,char.dispose,这时dispose的主体是@char,而不是数组@character_sprites中的元素。
那么@character_sprites.delete(@char)的确是删除了数组@character_sprites中的元素。

定义del_usr_sprite中的这两个操作并不是同一个对象,第一个是@char,第二个是@character_sprites。

建议,你在混淆的时候用p @character_sprites 和 p @char来查看你的变量实际值。
作者: zhangbanxian    时间: 2012-10-8 14:45
protosssonny 发表于 2012-10-8 14:32
这种菜应该没人抢吧?料想一定不会有人的,那么P叔抢了。好饿呀。

先回答主题:char.dispose的确 ...

- -b建议ls试验下,@char里存的就是指向@character_sprites中末尾元素的指针,数组的push方法不生成新对象...
作者: qbjxiaolei    时间: 2012-10-8 14:54
感觉不用指针反而有点搞不懂了,return的时候会产生新对象吗?
作者: 怪蜀黍    时间: 2012-10-8 15:09
zhangbanxian 发表于 2012-10-8 14:45
- -b建议ls试验下,@char里存的就是指向@character_sprites中末尾元素的指针,数组的push方法不生成新对 ...

脚本设计:


执行情况:
第一个p的情况:

第二个p的情况,以下是push方法生成了新对象的证据:

第三个p的情况:

第四个p的情况,push生成的对象已经被delete了:

嗷呜
作者: qbjxiaolei    时间: 2012-10-8 15:15
恩,我看懂了,应该还是释放正确了的代码。看来返回对象也是返回的指针之类的。。。
作者: 怪蜀黍    时间: 2012-10-8 15:23
zhangbanxian 发表于 2012-10-8 14:45
- -b建议ls试验下,@char里存的就是指向@character_sprites中末尾元素的指针,数组的push方法不生成新对 ...

晕死,我说的对象和你说的对象是2个不同的东西。你说的都是0x1145a90这个东西,我说的是对象分别指
def del_usr_sprite 中的2句话:
  1. char.dispose();
  2. @character_sprites.delete(char);
复制代码
第一句中的对象是char,是被dispose的对象
第二句中的对象是@character_sprites,是被delete的对象

作者: 怪蜀黍    时间: 2012-10-8 15:46
zhangbanxian 发表于 2012-10-8 14:45
- -b建议ls试验下,@char里存的就是指向@character_sprites中末尾元素的指针,数组的push方法不生成新对 ...

关于点评:“- -b那你想说明什么?第一步是char在dispose,然后第二步是@character_sprites清除了char的指针?我觉得lz在意的是这句话写没写对吧”的回答:
嗷呜,是这样的啊,你总结得很好啊。
我其实就想说明LZ的脚本返回了一个不必要返回的东西return char,结果导致了
  1. char.dispose();
  2. @character_sprites.delete(char)
复制代码
操作了2个不同的主体(我不说对象了,免得又混淆)
因为从第2个函数我们看得出LZ的初衷就是想对@character_sprites中的元素进行dipose和delete。我就是想说这个。
  1. def add_usr_sprite(game_character)
  2.   char=Sprite_Character.new(@viewport1,game_character);
  3.   @character_sprites.push(char);
  4.   return @character_sprites #如果变成这样我就没话说了
  5. end
复制代码
喵~~~




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1