查看: 3676|回复: 16

[已经解决] 在方法内使用self.读取方法和使用对应实变量读取属性的区别

[复制链接]
梦石
0
星屑
162
在线时间
79 小时
注册时间
2012-8-16
回帖
32
发表于 2017-7-11 05:54:56 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 rt6543ew 于 2017-7-11 06:12 编辑

在看技能树脚本的时候看到这样一段脚本
  1. class Tree_selectable < Window_Base
  2.   #--------------------------------------------------------------------------
  3.   # ● 定义实例变量
  4.   #--------------------------------------------------------------------------
  5.   attr_reader   :index                    # 光标位置
  6.   attr_reader   :help_window              # 帮助窗口
  7.   #--------------------------------------------------------------------------
  8.   # ● 初始画对像
  9.   #     x      : 窗口的 X 坐标
  10.   #     y      : 窗口的 Y 坐标
  11.   #     width  : 窗口的宽
  12.   #     height : 窗口的高
  13.   #--------------------------------------------------------------------------
  14.   def initialize(x, y, width, height)
  15.     super(x, y, width, height)
  16.     @item_max = 1
  17.     @column_max = 1
  18.     @index = -1
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 设置光标的位置
  22.   #     index : 新的光标位置
  23.   #--------------------------------------------------------------------------
  24.   def index=(index)
  25.     @index = index
  26.     # 刷新帮助文本 (update_help 定义了继承目标)
  27.     if self.active and @help_window != nil #如果自身的active是true且
  28.       update_help
  29.     end
  30.     # 刷新光标矩形
  31.     update_cursor_rect
  32.   end
  33.   #--------------------------------------------------------------------------
  34.   # ● 帮助窗口的设置
  35.   #     help_window : 新的帮助窗口
  36.   #--------------------------------------------------------------------------
  37.   def help_window=(help_window)
  38.     @help_window = help_window
  39.     # 刷新帮助文本 (update_help 定义了继承目标)
  40.     if self.active and @help_window != nil
  41.       update_help
  42.     end
  43.   end
  44. end
复制代码

在这段脚本的27行,为何对active属性使用读取方法而对help_window属性直接读取了其对应的实变量?
梦石
0
星屑
19426
在线时间
3082 小时
注册时间
2013-1-11
回帖
1207
发表于 2017-7-11 08:14:02 | 显示全部楼层
因为help_window在第六行已经声明了直接可以读取啊
回复

使用道具 举报

梦石
0
星屑
162
在线时间
79 小时
注册时间
2012-8-16
回帖
32
 楼主| 发表于 2017-7-11 09:06:26 | 显示全部楼层
张咚咚 发表于 2017-7-11 08:14
因为help_window在第六行已经声明了直接可以读取啊

我只是想问为什么不用self.help_window或者@active
回复

使用道具 举报

梦石
0
星屑
900
在线时间
76 小时
注册时间
2017-7-10
回帖
20
发表于 2017-7-11 09:17:17 | 显示全部楼层
rt6543ew 发表于 2017-7-11 09:06
我只是想问为什么不用self.help_window或者@active

怎么说呢,我就个人习惯来说,self我一般用来调用自身方法,对于你这个问题,我觉得看情况说事,而且编程方法很多,不限于一种。
回复

使用道具 举报

老黄鸡

梦石
4
星屑
45700
在线时间
7948 小时
注册时间
2009-7-6
回帖
13338

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2017-7-11 09:41:15 | 显示全部楼层
rt6543ew 发表于 2017-7-11 09:06
我只是想问为什么不用self.help_window或者@active


方法和变量显然是不同的吧
  1. def active
  2. return nil
  3. end
复制代码


你觉得self.active和@active区别在哪里呢?

点评

不是很能明白访问控制是如何做到这种效果的,可以解释一下吗?  发表于 2017-7-13 06:39
不见得啊,这样做就属于访问控制,比如你希望获取hp的时候不会超过maxhp,不会小于0,就可以这么做。  发表于 2017-7-11 11:53
但active不是Window类及其子类的属性吗?对于一个实例的一个属性来说,其读取方法的定义不就是return这个属性所对应的实变量吗?  发表于 2017-7-11 10:40

评分

参与人数 1星屑 +150 收起 理由
RyanBern + 150 醋瞎鸡

查看全部评分

RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

梦石
0
星屑
19426
在线时间
3082 小时
注册时间
2013-1-11
回帖
1207
发表于 2017-7-11 10:29:14 | 显示全部楼层
本帖最后由 张咚咚 于 2017-7-11 18:07 编辑
rt6543ew 发表于 2017-7-11 09:06
我只是想问为什么不用self.help_window或者@active


这和java是一个意思,一个类里面,如果变量没有与方法函数重名,使用var和super.var没有任何区别的


[pre lang="ruby"]class Window_aa
  
  attr_accessor :var
  
  def initialize
    @var = 1  #实例化变量
  end
  def mt(var)
    p var #局部变量
    p @var #实例变量,不好意思蒙圈了,是实例变量只有实例后才有效
    p self.var #与类变量一致,但必须要本类或父类声明 attr_accessor :var 才可调用
  end
end

Window_aa.new.mt(555)

class Window_bb < Window_aa

  def initialize
    super  #实例化变量(调用父类)
  end
  
  def mt(var)
    p var #局部变量
    p @var #实例变量
    p self.var #与类变量一致,但必须要本类或父类声明 attr_accessor :var 才可调用
  end
  
end

Window_bb.new.mt(555)[/pre]

这样应该就好理解了吧

点评

在注释里请把所有的“类变量”换成“实例变量”。“类变量”是以 @@ 开头的变量。注意一下这个区别。  发表于 2017-7-11 17:43
对  发表于 2017-7-11 10:44
也就是说实际上没有区别?  发表于 2017-7-11 10:42
回复

使用道具 举报

梦石
0
星屑
2306
在线时间
1010 小时
注册时间
2012-4-30
回帖
1455

开拓者

发表于 2017-7-11 11:42:02 | 显示全部楼层
就是self.active其实是调用一个返回@active的方法名为active的方法吧
其实为了美观强行多个方法返回变量值MV更常见 定义变量喜欢_开头然后觉得不美观强行多个方法使得美观.所以说是一个意思没区别的
回复

使用道具 举报

梦石
0
星屑
162
在线时间
79 小时
注册时间
2012-8-16
回帖
32
 楼主| 发表于 2017-7-11 14:23:44 | 显示全部楼层
fux2 发表于 2017-7-11 09:41
方法和变量显然是不同的吧

对属性的读取方法重定义?
回复

使用道具 举报

老黄鸡

梦石
4
星屑
45700
在线时间
7948 小时
注册时间
2009-7-6
回帖
13338

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2017-7-11 16:31:04 | 显示全部楼层
rt6543ew 发表于 2017-7-11 14:23
对属性的读取方法重定义?

算不上重定义吧。
用attr设置访问控制,实际上也就是相当于帮你定义了直接返回同名成员变量的函数。

点评

能解释一下访问控制这个概念吗,上网上查了一下看不懂  发表于 2017-7-12 08:16
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2017-7-12 13:04:19 | 显示全部楼层
直接认为ruby里没有属性这个概念,self.x 就是调用名为 :x 的方法。
attr_reader :x
就是
def x
  @x
end
attr_writer :x
就是
def x=(x)
  @x=x
end
你如果不声明属性x,调用 self.x 会报undefined method错。
  1. class A
  2.   def initialize
  3.     @x = 0
  4.   end
  5. end
  6. a = A.new
  7. a.instance_variables
  8. a.instance_variable_get(:@x)
  9. a.x # 报错
复制代码
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 1 0

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部