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