Project1

标题: 不直接使用全局变量改变另一个对象里的实例变量 [打印本页]

作者: srwjrevenger    时间: 2019-10-31 11:05
标题: 不直接使用全局变量改变另一个对象里的实例变量
本帖最后由 srwjrevenger 于 2019-11-1 12:20 编辑
  1. class Abc
  2. def aa
  3.   @a||=0
  4.   @b||=1 ###
  5.   @a+=@b
  6.   @a
  7. end
  8. end
  9. #######以下不清楚什么类
  10. def bb
  11. @a=10 #
  12. end

  13.   def cc
  14.   @b=10 #
  15.   end
复制代码


我原本的意思是
执行bb 后改变class Abc里面aa生成之后 @a 的值
执行cc 后改变###那里 @b 的值
不过每次执行 aa 时 @a @b 又恢复成 0 1 了

有办法不使用全局变量$game_variables之类的
实现我想要的吗
作者: 喵呜喵5    时间: 2019-10-31 11:55
  1. class 你的钱包
  2.   def aa
  3.     @余额||=0
  4.     @账单||=1
  5.     @余额+=@账单
  6.     @余额
  7.   end
  8. end
  9. #######以下是我的钱包
  10. def bb
  11.   @余额=10
  12. end
  13. def cc
  14.   @账单=10
  15. end
复制代码


虽然执行 bb cc 能够改变我的钱包的 @余额 @账单
不过每次执行 你的钱包的 aa 时 @余额 @账单 还是你的钱包的 0 1

有办法不使用全局变量,改变我的钱包的变量 @账单 后,你的钱包的账单就变成我的账单吗?

答:你提供的信息太少了,无法确定具体问题

方法需要具体问题具体分析,比如两个 class 虽然不同类,但是却有同一个父类……或者两个 class 有一个共享的父作用域可以操作等等……
作者: srwjrevenger    时间: 2019-10-31 13:59
喵呜喵5 发表于 2019-10-31 11:55
虽然执行 bb cc 能够改变我的钱包的 @余额 @账单
不过每次执行 你的钱包的 aa 时 @余额 @账单 还是你的钱 ...

我果然还是语文渣吗OTL
  举个例子吧
  class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 生成遇敌计数
  #--------------------------------------------------------------------------
  def make_encounter_count #默认脚本
    n = $game_map.encounter_step
    @encounter_count  =rand(n) + rand(n) + 1
     @encounter_count
  end
  end

  如果用@a随意改变遇敌率
    class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 生成遇敌计数
  #--------------------------------------------------------------------------
  def make_encounter_count
    n = $game_map.encounter_step
    @encounter_count  =rand(n) + rand(n) + 1
    @encounter_count=@encounter_count*@a #123
    @encounter_count
  end
  end

  @a有默认值1,使用函数aa可以改变@a,aa不知道要丢什么类

  或者不要123那一行
  直接使用函数bb直接改变生成之后的@encounter_count ,bb还是不知道要丢什么类
   
  因为只是举例,并没有相关的 @a aa bb
  使用全局变量虽然能简单解决,
  不过不想滥用,
  感觉因为我一定会出bug呀呀呀呀呀呀

作者: soulsaga    时间: 2019-10-31 16:10
本帖最后由 soulsaga 于 2019-11-1 10:37 编辑

RUBY 代码复制
  1. class ABC
  2. def aa(a=0,b=1)
  3.   a+=b
  4.   a
  5. end
  6. end
  7.  
  8. class Game_Player < Game_Character
  9.   #--------------------------------------------------------------------------
  10.   # ● 生成遇敌计数
  11.   #--------------------------------------------------------------------------
  12.   def make_encounter_count
  13.     n = $game_map.encounter_step
  14.     @encounter_count  =rand(n) + rand(n) + 1
  15.     @a=ABC.new
  16.     @a=@a.aa(10,10)
  17.     @encounter_count=@encounter_count*@a #123
  18.     @encounter_count
  19.   end
  20.   end
给aa參数再调用就行了么..


作者: 喵呜喵5    时间: 2019-10-31 17:42
本帖最后由 喵呜喵5 于 2019-10-31 17:45 编辑

Game_Player 的实例本身就作为全局变量储存在 $game_player 里

给 Game_Player 定义一个方法(选个不容易重复的方法名),然后 $game_player 调用这个方法就好了
例如下面这样

  1. class Game_Player < Game_Character
  2.   attr_accessor :my_var_20191031
  3.   def make_encounter_count
  4.     n = $game_map.encounter_step
  5.     @encounter_count  =rand(n) + rand(n) + 1 + @my_var_20191031
  6.     @encounter_count
  7.   end
  8.   def my_method_20191031(v)
  9.      @my_var_20191031 += v
  10.   end
  11. end
复制代码

  1. $game_player.my_var_20191031= 123456
  2. $game_player.my_method_20191031(654321)
复制代码

作者: hyrious    时间: 2019-10-31 21:12
本帖最后由 hyrious 于 2019-11-1 06:40 编辑

LZ 你还是补点 ruby 基础再来问问题吧
首先,游戏里不管是 $game_player 还是其他 $game_xxx,他们都是对应类的“实例”,而实例变量(也就是 @ 开头的变量)是和对象关联的,也就是说同一个类 .new 出来的两个对象拥有实际上不同的实例变量
  1. class A
  2.   def initialize(a=0) @a = a end
  3.   def a() @a end
  4. end
  5. a = A.new(42); a.a #=> 42
  6. b = A.new(24); b.a #=> 24 # 和 a.a 无关
复制代码

所以你的问题其实是:如何改变另一个对象里的实例变量
答案是,要么定义修改实例变量的方法,要么元编程
  1. class A
  2.   def a=(x) @a = x end
  3. end
  4. a = A.new
  5. a.a = 123 # 这里等价于调用了 .a=(123)
  6. a.a #=> 123
复制代码

元编程等你理解了什么是 ruby 对象再看

  1. class Game_Player < Game_Character
  2.   #--------------------------------------------------------------------------
  3.   # ● 生成遇敌计数
  4.   #--------------------------------------------------------------------------
  5.   def make_encounter_count
  6.     n = $game_map.encounter_step
  7.     @encounter_count = rand(n) + rand(n) + 1
  8.     @encounter_count = (@encounter_count * (@a || 1)).to_i
  9.     @encounter_count
  10.   end
  11.   #--------------------------------------------------------------------------
  12.   # ● 定义一个方法用于修改 @a
  13.   #--------------------------------------------------------------------------
  14.   def aa a
  15.     @a = a
  16.   end
  17. end

  18. # 修改时:
  19. $game_player.aa(0.5)
复制代码

作者: xsrong2    时间: 2019-11-29 16:29
可以用instance_variable_set方法

  1. class Dog
  2.   def set_name(name)
  3.     @name = name
  4.   end

  5.   def name
  6.     @name
  7.   end
  8. end

  9. dog = Dog.new
  10. dog.set_name("WangCai")
  11. p dog.name     #=> "WangCai"

  12. dog.instance_variable_set(:@name, "AHuang")
  13. p dog.name     # => "Ahuang"
复制代码

  




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