设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3249|回复: 16
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
152
在线时间
78 小时
注册时间
2012-8-16
帖子
44
跳转到指定楼层
1
发表于 2017-7-11 05:54:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 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属性直接读取了其对应的实变量?

Lv4.逐梦者

梦石
0
星屑
19334
在线时间
3077 小时
注册时间
2013-1-11
帖子
1288
2
发表于 2017-7-11 08:14:02 | 只看该作者
因为help_window在第六行已经声明了直接可以读取啊
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
152
在线时间
78 小时
注册时间
2012-8-16
帖子
44
3
 楼主| 发表于 2017-7-11 09:06:26 | 只看该作者
张咚咚 发表于 2017-7-11 08:14
因为help_window在第六行已经声明了直接可以读取啊

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

使用道具 举报

Lv2.观梦者

梦石
0
星屑
900
在线时间
75 小时
注册时间
2017-7-10
帖子
27
4
发表于 2017-7-11 09:17:17 | 只看该作者
rt6543ew 发表于 2017-7-11 09:06
我只是想问为什么不用self.help_window或者@active

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

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
41081
在线时间
7566 小时
注册时间
2009-7-6
帖子
13498

开拓者贵宾

5
发表于 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
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
19334
在线时间
3077 小时
注册时间
2013-1-11
帖子
1288
6
发表于 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没有任何区别的


RUBY 代码复制
  1. class Window_aa
  2.  
  3.   attr_accessor :var
  4.  
  5.   def initialize
  6.     @var = 1  #实例化变量
  7.   end
  8.   def mt(var)
  9.     p var #局部变量
  10.     p @var #实例变量,不好意思蒙圈了,是实例变量只有实例后才有效
  11.     p self.var #与类变量一致,但必须要本类或父类声明 attr_accessor :var 才可调用
  12.   end
  13. end
  14.  
  15. Window_aa.new.mt(555)
  16.  
  17. class Window_bb < Window_aa
  18.  
  19.   def initialize
  20.     super  #实例化变量(调用父类)
  21.   end
  22.  
  23.   def mt(var)
  24.     p var #局部变量
  25.     p @var #实例变量
  26.     p self.var #与类变量一致,但必须要本类或父类声明 attr_accessor :var 才可调用
  27.   end
  28.  
  29. end
  30.  
  31. Window_bb.new.mt(555)


这样应该就好理解了吧

点评

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

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1369
在线时间
962 小时
注册时间
2012-4-30
帖子
1475

开拓者

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
152
在线时间
78 小时
注册时间
2012-8-16
帖子
44
8
 楼主| 发表于 2017-7-11 14:23:44 | 只看该作者
fux2 发表于 2017-7-11 09:41
方法和变量显然是不同的吧

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

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
41081
在线时间
7566 小时
注册时间
2009-7-6
帖子
13498

开拓者贵宾

9
发表于 2017-7-11 16:31:04 | 只看该作者
rt6543ew 发表于 2017-7-11 14:23
对属性的读取方法重定义?

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

点评

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

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23984
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

10
发表于 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

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-21 19:08

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表