Project1
标题:
“attr_accessor符号、方法、局部变量、实例变量”的异同
[打印本页]
作者:
Vortur
时间:
2018-3-28 18:34
标题:
“attr_accessor符号、方法、局部变量、实例变量”的异同
本帖最后由 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”条目)
展开图片
作者:
孟筠欢
时间:
2018-3-28 19:00
提示:
作者被禁止或删除 内容自动屏蔽
作者:
chd114
时间:
2018-3-28 21:12
不过ruby里所有东西都是对象吧···所以是不应该存在完全无关的情况?
作者:
guoxiaomi
时间:
2018-3-28 21:26
本帖最后由 guoxiaomi 于 2018-3-28 21:28 编辑
可以参考一下这里的定义
http://ruby-doc.org/core-1.8.6/Module.html#method-i-attr
作者:
喵呜喵5
时间:
2018-3-28 21:59
不要造定义,attr 只是个语法糖
attr_accessor 就是快速定义两个方法
def a; return @a; end
def a=(v); @a = v; end
方法什么规则它就是什么规则
作者:
晴兰
时间:
2018-3-28 23:36
提示:
作者被禁止或删除 内容自动屏蔽
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1