Project1

标题: 有没有人能够具体的解释下实变量 变量 全局变量?? [打印本页]

作者: liu3124493    时间: 2013-7-22 10:49
标题: 有没有人能够具体的解释下实变量 变量 全局变量??
本帖最后由 liu3124493 于 2013-7-22 12:31 编辑

实变量 变量 全局变量的区别还有attr_accessor  attr_reader attr_writer
变量的话 我还能理解 就是只能在定义的函数中使用 没有定义的不能用,全局变量就是在所有的函数中都能用,但实变量为属于个体对象的变量??实变量使用范围?
还有attr_accessor 也即给实变量附加属性?
def name
   return @name
  end
  def name=(name)
    @name = name
  end
而attr_reader是读取实变量属性,不能进行修改
def name
   return @name
  end
定义使得即使通过这个类的对象,在外部也只能访问到这个变量属性的值,而不能修改。比如我在Window_Command设定了 attr_reader   :commands
但具体的作用是什么?能举个例吗?
作者: 认真的学    时间: 2013-7-22 11:13
本帖最后由 认真的学 于 2013-7-22 11:17 编辑

有点没有明白你的问题= =
实变量,是说实例变量么?实例变量是这个类的实例所拥有的变量,使用范围就在这个实例里面。每个实例的实例变量是互相独立的。(即对于一个实例的实例变量的操作,不会影响其它实例的相应变量)。
外界本来是不能访问实例的实例变量的,所以我们需要通过attr_accessor、attr_reader等等让外界可以访问这个实例变量。attr_accessor让实例变量对于外界来说可写可读,而attr_reader让实例变量对于外界来说只是可读的。
attr_accessor、attr_reader等等限制了外界对实例变量的访问权利。应将外界对实例变量的访问权利尽量降到最低(比如某个变量只需要读取,就不用给外界写入的权利)。
作者: liu3124493    时间: 2013-7-22 11:23
认真的学 发表于 2013-7-22 11:13
有点没有明白你的问题= =
实变量,是说实例变量么?实例变量是这个类的实例所拥有的变量,使用范围就在这个 ...

我说的实变量是在帮助里面定义类里面的,有点明白了,意思就是实变量只能在所在的类里面使用?其他的类就没定义的话就不能用该变量?
而attr_reader这些所指的外部是指什么,类外吗?
作者: 认真的学    时间: 2013-7-22 11:29
liu3124493 发表于 2013-7-22 11:23
我说的实变量是在帮助里面定义类里面的,有点明白了,意思就是实变量只能在所在的类里面使用?其他的类就 ...

是的,对实例变量的理解正确。
外部指的是除了这个类以外的地方= =就是说除了这个类其它都是外部= =
作者: 怪蜀黍    时间: 2013-7-22 12:19
本帖最后由 protosssonny 于 2013-7-22 12:40 编辑

先把讨厌的@Person 去掉!免得干扰我写脚本!
我举个简单通俗的例子:
  1. class Person
  2.   attr_accessor :int
  3.   attr_reader   :luk
  4.   attr_writer   :spd
  5.   #--------------------------------------------------------------------------
  6.   # ● 初始化对像
  7.   #--------------------------------------------------------------------------
  8.   def initialize
  9.     # 因为在class Person内部的函数,所以一下都是内部操作
  10.     @int = 1          # 写入有效,因为是在本类内部的操作
  11.     @luk = 2          # 写入有效,因为是在本类内部的操作
  12.     @spd = 3          # 写入有效,因为是在本类内部的操作
  13.     array = []      # 初始化一个数组
  14.     array[0] = @int   # 读取有效,因为是在本类内部的操作
  15.     array[1] = @luk   # 读取有效,因为是在本类内部的操作
  16.     array[2] = @spd   # 读取有效,因为是在本类内部的操作
  17.   end
  18. end

  19. class Scene_Map < Scene_Base
  20.   #--------------------------------------------------------------------------
  21.   # ● 开始处理
  22.   #--------------------------------------------------------------------------
  23.   def start
  24.     super
  25.     $game_map.refresh
  26.     @spriteset = Spriteset_Map.new
  27.     @message_window = Window_Message.new
  28.     # 以上是默认的脚本,保留它们。
  29.     # 现在起,一切都属于外部操作:
  30.     @person = Person.new
  31.     @person.int = 10        # 写入有效,因为读写属性attr_accessor :int
  32.     @person.luk = 20        # 写入报错,因为只读属性attr_reader   :luk
  33.     @person.spd = 30        # 写入有效,因为只写属性attr_writer   :spd
  34.     array = []            # 初始化一个数组
  35.     array[0] = @person.int  # 读取有效,因为读写属性attr_accessor :int
  36.     array[1] = @person.luk  # 读取有效,因为只读属性attr_reader   :luk
  37.     array[2] = @person.spd  # 读取报错,因为只写属性attr_writer   :spd
  38.   end
  39. end
复制代码
搞清楚点的含义"."
  1. a.b
复制代码
表示调用a所在类的函数b,而不是调用a所在类的实例变量@b。
因为写了:
  1. attr_reader   :b
复制代码
就相当于写了:
  1. def b
  2.   return @b
  3. end
复制代码
我们最终a.b得到的值@b是因为def b返回值就是@b。
如果是写了:
  1. attr_writer  :b
复制代码
那么
  1. a.b = c
复制代码
是把a所在类的@b赋值为c,是因为attr_writer  :b的等效脚本使得参数b被赋到了@b上:
  1. def b=(b)
  2.   @b = b
  3. end
复制代码
只有把这两个弄清楚了你才能了解到实例变量的真谛!   
作者: liu3124493    时间: 2013-7-22 12:26
本帖最后由 liu3124493 于 2013-7-22 12:52 编辑
protosssonny 发表于 2013-7-22 12:19
我举个简单通俗的例子:搞清楚点的含义"."表示调用a所在类的函数b,而不是调用a所在类的实例变量@b。
因为 ...


嗯 大部分明白了
作者: liu3124493    时间: 2013-7-22 12:30
谢谢大家的解答。十分感谢




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1