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

Project1

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

[讨论] “attr_accessor符号、方法、局部变量、实例变量”的异同

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1293
在线时间
995 小时
注册时间
2014-12-14
帖子
3016

开拓者

跳转到指定楼层
1
发表于 2018-3-28 18:34:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 Vortur 于 2018-3-28 23:32 编辑

摘要

  对于“attr_accessor、方法、局部变量、实例变量”,探求它们之间的关系:四个元素“attr_accessor、方法、局部变量、实例变量”进行组合,共有六种结果(六组关系)
  这是一个民科的帖子,虽然在下也在纠结它存在的必要性...但它确实是在学习脚本的途中遇到的问题...如果有同好喜欢,在下欣之,如果不幸被讨厌...那也可以算作可喜...吧

一、结论

【attr_accessor => 方法】
  使用“attr_accessor”定义实例变量,相当于定义了一个空的、无参数的同名“方法”
attr 只是语法糖,attr_accessor 就是快速定义两个方法:
def a; return @a; end
def a=(v); @a = v; end

【attr_accessor !> 局部变量】
  “attr_accessor”跟“局部变量”无关。虽然“无参数方法”的调用与“局部变量”相似
【attr_accessor == 实例变量】[条件]
  “attr_accessor”方法声明一个实例变量,使得该实例变量可以在外部被调用
【方法 == 局部变量】[条件]
  “无参数方法”的调用与“局部变量”相似,如果两者同名,较后定义的代码将会生效
【实例变量 += attr_accessor ~> 方法】
  通过“attr_accessor”定义的实例变量,可以作为一个无参数的方法使用
【实例变量 !> 局部变量】
  实例变量与局部变量无关
二、前提

  1. 【attr_accessor == 实例变量】(——《attr_reader是什么意思》《ruby中attr_accessor方法的理解》):使用“attr_accessor”类方法定义“实例变量”后,就可用“实例.实例变量”的方式读写/读取/写入该实例变量

  2. 【方法 == 局部变量】(“局部变量和无参数的方法调用时非常相似。因此,如果出现撞名的情况,较后定义的会生效”——RaidenInfinity.《RMVA - RGSS3脚本入门教程●2.3实例方法与变量》):“局部变量”相当于“无参数方法”

  3. 【“实例变量”默认为nil】(“未初始化的实例变量为nil”——taroxd.《F1 帮助文档汉化版●RGSS参考●Ruby语法●变量和常量》):“实例变量”不必事先定义,就可作为“值为nil的变量”直接使用

  4. 【局部变量只能在代码块中生效】

三、推理

  1. 【attr_accessor => 空的方法】
  ∵ 在类中声明“attr_accessor   :bianliang”后,就可直接将代码字段“bianliang”作为值为nil的变量使用。而不声明“attr_accessor   :bianliang”时,系统将提示“无名为‘bianliang’的局部变量或方法”
  ∴ “attr_accessor”相当于声明了一个“空的方法”,或声明了一个“空的局部变量”
  ∵ 局部变量只在代码块内生效,且“attr_accessor”是跨代码块生效的
  ∴ “attr_accessor”仅相当于声明了一个“空的方法”

  2. 【attr_accessor !> 局部变量】
  ∵ 在类“Lei_A”中、方法“fang_fa”外,声明“attr_accessor   :bianliang”后,在方法“fang_fa”内,“bianliang”可以作为一个值为nil的变量使用
  ∴ “attr_accessor”相当于声明了一个“空的方法”,或声明了一个“空的局部变量”
  ∵ 局部变量无法跨代码块生效:在方法“fang_fa”外声明的局部变量,在方法“fang_fa”内无法使用
  ∴ “attr_accessor”与局部变量无关

  3. 【attr_accessor == 实例变量】
  ∵ 在类“Lei_A”中,声明“attr_accessor   :bianliang”后,可以用类“Lei_A”的实例“lei_a_shili”对实例变量“@bianliang”进行操作:"lei_a_shili.bianliang=1"
  ∴ “attr_accessor”方法声明一个实例变量,使得该实例变量可以在外部被调用

  4. 【方法 == 局部变量】
  ∵ 未事先定义无参数方法或局部变量“bianliang”时,直接在方法“fangfa”中调用“bianliang”,系统将提示“无名为‘bianliang’的局部变量或方法”
  ∴ 局部变量的调用,与无参数方法相似

  5. 【实例变量 += attr_accessor ~> 方法】
  ∵ 声明“attr_accessor   :bianliang”后,可以通过对实例变量“@bianliang”进行赋值操作,进而对代码字段“bianliang”进行赋值;而未声明“attr_accessor   :bianliang”时,则无法通过实例变量操作代码字段“bianliang”
  ∴ “attr_accessor   :bianliang”可以使得实例变量操作无参数方法

  6. 【实例变量 !> 局部变量】
  两者的作用域不同

四、实验

  打开“脚本编辑器”(热键F11),删除所有脚本,输入下图中的实验用代码;然后用“控制变量法”选择注释不同行目的代码,可得出【推理】章节的结论(请务必首先注释掉默认脚本的“Main”条目)
展开图片

【RMVA教程】
---------------------
欲买桂花同载酒,终不似,少年游.

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

来自 4楼
发表于 2018-3-28 21:26:21 | 只看该作者
本帖最后由 guoxiaomi 于 2018-3-28 21:28 编辑

可以参考一下这里的定义 http://ruby-doc.org/core-1.8.6/Module.html#method-i-attr

点评

郭大触!❤❤❤谢谢~❤❤❤  发表于 2018-3-28 21:55
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
20945
在线时间
9333 小时
注册时间
2012-6-19
帖子
7106

开拓者短篇九导演组冠军

来自 5楼
发表于 2018-3-28 21:59:57 | 只看该作者
不要造定义,attr 只是个语法糖
attr_accessor 就是快速定义两个方法
def a; return @a; end
def a=(v); @a = v; end
方法什么规则它就是什么规则

点评

喵大万岁~❤原来如此...attr_accessor就是定义def...❤  发表于 2018-3-29 17:27
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv4.逐梦者 (禁止发言)

梦石
0
星屑
10691
在线时间
15 小时
注册时间
2018-3-28
帖子
25
2
发表于 2018-3-28 19:00:51 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9275
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

3
发表于 2018-3-28 21:12:59 | 只看该作者
不过ruby里所有东西都是对象吧···所以是不应该存在完全无关的情况?

点评

Sprite.width只是单纯的def width返回一个0还是在Sprite的时候就已经有设置返回初始值为0的@width了?我之前看Game_BattlerBase里面能力基础值是直接返回0的情况  发表于 2018-3-28 23:09
而是生成一个空的def width,或者说一个空的@width  发表于 2018-3-28 21:54
经过尝试,发现对象之间还是有差别的。比如在Sprite里定义attr_accessor :width,并不会直接覆盖原本的Sprite.width(原本的Sprite.width是0)  发表于 2018-3-28 21:54
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

6
发表于 2018-3-28 23:36:50 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-25 22:29

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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