查看: 2976|回复: 4

[已经解决] 关于使用类方法更改实例变量

[复制链接]

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2014-3-4 17:15:03 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 喵呜喵5 于 2014-3-4 17:43 编辑

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

[pre lang="ruby" line="1"]#--------------------------------------------------------------------------
# ● 设置窗口
#--------------------------------------------------------------------------
class New_Window < Window_Base
  #--------------------------------------------------------------------------
  # ● 开始处理,设置实例变量@flags、@num
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, Graphics.width, Graphics.height)
    @flags = true
    @num = 0
  end
  #--------------------------------------------------------------------------
  # ● 更新,如果@flags打开的时候在控制台输出@num
  #--------------------------------------------------------------------------
  def update
    super   
    if @flags      
      p @num
      @num += 1
    end   
  end
  #--------------------------------------------------------------------------
  # ● 类方法 New_Window.change ,@flags变成相反的值
  #--------------------------------------------------------------------------
  def self.change
    @flags = !@flags
    p @flags
  end  
end
#--------------------------------------------------------------------------
# ● 载入地图
#--------------------------------------------------------------------------
class Scene_Map
  alias new_create_all_windows create_all_windows
  def create_all_windows
    new_create_all_windows
    @new_window =  New_Window.new
  end
end[/pre]  

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-3-4 17:22:39 | 显示全部楼层
本帖最后由 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
复制代码

点评

对了,类的实例变量的值和其子类相同吗?  发表于 2014-3-4 18:24

评分

参与人数 1星屑 +100 收起 理由
喵呜喵5 + 100 感谢帮忙

查看全部评分

回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-3-4 17:30:17 | 显示全部楼层
本帖最后由 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
复制代码

评分

参与人数 2星屑 +100 梦石 +1 收起 理由
迷糊的安安 + 1 可行,塞卡
喵呜喵5 + 100 可行,塞糖

查看全部评分

回复

使用道具 举报

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

 楼主| 发表于 2014-3-4 17:25:20 | 显示全部楼层
taroxd 发表于 2014-3-4 17:22
你修改的是类的实例变量

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

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

点评

不相同,因为每个类都是不同的Class类的实例  发表于 2014-3-4 18:28
顺手求糖  发表于 2014-3-4 17:31
回复

使用道具 举报

梦石
0
星屑
50
在线时间
1281 小时
注册时间
2006-8-27
回帖
550
发表于 2014-3-4 18:16:16 | 显示全部楼层
为什么不把 @flags 全换成 @@flags 呢

点评

New_Window.change 不就把所有这个窗口的这个变量都变了吗 没区别吧  发表于 2014-3-5 19:11
因为还要加初始化的代码……  发表于 2014-3-4 18:18
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部