Project1

标题: 关于使用类方法更改实例变量 [打印本页]

作者: 喵呜喵5    时间: 2014-3-4 17:15
标题: 关于使用类方法更改实例变量
本帖最后由 喵呜喵5 于 2014-3-4 17:43 编辑

写了一段脚本,定义了一个修改实例变量的类方法,但是实际测试的时候发现这个类方法并不会改变实例的运行,求解

RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2. # ● 设置窗口
  3. #--------------------------------------------------------------------------
  4. class New_Window < Window_Base
  5.   #--------------------------------------------------------------------------
  6.   # ● 开始处理,设置实例变量@flags、@num
  7.   #--------------------------------------------------------------------------
  8.   def initialize
  9.     super(0, 0, Graphics.width, Graphics.height)
  10.     @flags = true
  11.     @num = 0
  12.   end
  13.   #--------------------------------------------------------------------------
  14.   # ● 更新,如果@flags打开的时候在控制台输出@num
  15.   #--------------------------------------------------------------------------
  16.   def update
  17.     super   
  18.     if @flags      
  19.       p @num
  20.       @num += 1
  21.     end   
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # ● 类方法 New_Window.change ,@flags变成相反的值
  25.   #--------------------------------------------------------------------------
  26.   def self.change
  27.     @flags = !@flags
  28.     p @flags
  29.   end  
  30. end
  31. #--------------------------------------------------------------------------
  32. # ● 载入地图
  33. #--------------------------------------------------------------------------
  34. class Scene_Map
  35.   alias new_create_all_windows create_all_windows
  36.   def create_all_windows
  37.     new_create_all_windows
  38.     @new_window =  New_Window.new
  39.   end
  40. end
  
作者: taroxd    时间: 2014-3-4 17:22
本帖最后由 taroxd 于 2014-3-4 17:36 编辑

你修改的是类的实例变量,而不是实例的实例变量

  1. # 你的代码
  2. class New_Window  # 再次打开类
  3.   p @flags   # => nil (未定义的实例变量)
  4.   change
  5.   p @flags   # => true
  6.   change
  7.   p @flags   # => false
  8. end
复制代码

作者: 喵呜喵5    时间: 2014-3-4 17:25
taroxd 发表于 2014-3-4 17:22
你修改的是类的实例变量

那么如何用类方法修改实例的实例变量呢?

另外如何获取这个类的实例变量的值?再写一个类方法:
  1. def self.数值
  2.   @flags
  3. end
复制代码

作者: taroxd    时间: 2014-3-4 17:30
本帖最后由 taroxd 于 2014-3-4 17:32 编辑
喵呜喵5 发表于 2014-3-4 17:25
那么如何用类方法修改实例的实例变量呢?

另外如何获取这个类的实例变量的值?再写一个类方法:? ...


第二个问题:正确。或者这样:
  1. class << self
  2.   attr_reader :flags
  3. end
复制代码
关于第一个问题,或许可以这样(我没有环境,很难测试)
  1. class A_Class
  2.   def self.change
  3.     ObjectSpace.each_object(self) do |obj|
  4.       obj.instance_eval { @flags ^= true }
  5.     end
  6.   end
  7. end
复制代码

作者: wbsy8241    时间: 2014-3-4 18:16
为什么不把 @flags 全换成 @@flags 呢




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