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

Project1

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

[已经解决] 有没有人能够具体的解释下实变量 变量 全局变量??

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
20 小时
注册时间
2013-7-4
帖子
17
跳转到指定楼层
1
发表于 2013-7-22 10:49:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 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
但具体的作用是什么?能举个例吗?

评分

参与人数 1星屑 +20 收起 理由
怪蜀黍 + 20 手动置顶认可加分

查看全部评分

Lv3.寻梦者 (版主)

八宝粥的基叔

梦石
0
星屑
4684
在线时间
5240 小时
注册时间
2009-4-29
帖子
14318

贵宾

来自 5楼
发表于 2013-7-22 12:19:55 | 只看该作者
本帖最后由 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
复制代码
只有把这两个弄清楚了你才能了解到实例变量的真谛!   

评分

参与人数 1梦石 +1 收起 理由
Luciffer + 1 认可答案

查看全部评分

《逝去的回忆3:四叶草之梦》真情发布,欢迎点击图片下载试玩喵。

《逝去的回忆3》的讨论群:
一群:192885514
二群:200460747
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
869 小时
注册时间
2009-3-13
帖子
782
2
发表于 2013-7-22 11:13:09 | 只看该作者
本帖最后由 认真的学 于 2013-7-22 11:17 编辑

有点没有明白你的问题= =
实变量,是说实例变量么?实例变量是这个类的实例所拥有的变量,使用范围就在这个实例里面。每个实例的实例变量是互相独立的。(即对于一个实例的实例变量的操作,不会影响其它实例的相应变量)。
外界本来是不能访问实例的实例变量的,所以我们需要通过attr_accessor、attr_reader等等让外界可以访问这个实例变量。attr_accessor让实例变量对于外界来说可写可读,而attr_reader让实例变量对于外界来说只是可读的。
attr_accessor、attr_reader等等限制了外界对实例变量的访问权利。应将外界对实例变量的访问权利尽量降到最低(比如某个变量只需要读取,就不用给外界写入的权利)。
我的寒假活动作品:http://rpg.blue/forum.php?mod=viewthread&tid=281065
咱的龙蛋,求点击:
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
20 小时
注册时间
2013-7-4
帖子
17
3
 楼主| 发表于 2013-7-22 11:23:19 | 只看该作者
认真的学 发表于 2013-7-22 11:13
有点没有明白你的问题= =
实变量,是说实例变量么?实例变量是这个类的实例所拥有的变量,使用范围就在这个 ...

我说的实变量是在帮助里面定义类里面的,有点明白了,意思就是实变量只能在所在的类里面使用?其他的类就没定义的话就不能用该变量?
而attr_reader这些所指的外部是指什么,类外吗?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
869 小时
注册时间
2009-3-13
帖子
782
4
发表于 2013-7-22 11:29:01 | 只看该作者
liu3124493 发表于 2013-7-22 11:23
我说的实变量是在帮助里面定义类里面的,有点明白了,意思就是实变量只能在所在的类里面使用?其他的类就 ...

是的,对实例变量的理解正确。
外部指的是除了这个类以外的地方= =就是说除了这个类其它都是外部= =
我的寒假活动作品:http://rpg.blue/forum.php?mod=viewthread&tid=281065
咱的龙蛋,求点击:
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
20 小时
注册时间
2013-7-4
帖子
17
6
 楼主| 发表于 2013-7-22 12:26:33 | 只看该作者
本帖最后由 liu3124493 于 2013-7-22 12:52 编辑
protosssonny 发表于 2013-7-22 12:19
我举个简单通俗的例子:搞清楚点的含义"."表示调用a所在类的函数b,而不是调用a所在类的实例变量@b。
因为 ...


嗯 大部分明白了

点评

Scene_Map不是Person的超类,在Scene_Map中改了@person的实例变量只对@person这个实例中的实例变量有效。  发表于 2013-7-22 12:31
@b是实例变量,b是一个返回@b的方法。因为有def b  发表于 2013-7-22 12:29
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
20 小时
注册时间
2013-7-4
帖子
17
7
 楼主| 发表于 2013-7-22 12:30:54 | 只看该作者
谢谢大家的解答。十分感谢
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-15 15:04

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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