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

Project1

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

[推荐问答] 【脚本请教】脚本中以'@'开头的变量如何使用

[复制链接]

Lv1.梦旅人

梦石
0
星屑
143
在线时间
62 小时
注册时间
2015-5-24
帖子
56
跳转到指定楼层
1
发表于 2015-5-25 21:06:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 RyanBern 于 2015-6-16 08:37 编辑

新手请教问题

脚本中的  @ 是如何定义运用的?
还有我看到别人使用@文字 等等
是如何运用的规律?

评分

参与人数 1星屑 +100 收起 理由
RyanBern + 100 设置为推荐问答

查看全部评分

Lv3.寻梦者

梦石
0
星屑
1733
在线时间
484 小时
注册时间
2006-1-7
帖子
1073
2
发表于 2015-5-25 22:48:13 | 只看该作者
想要系统的学习一下,请看置顶的帖子
这里面凝结了版主的心血
你知道吗,把教程规划的这么井井有条是很不容易的
其实很大程度上方便了我们阅读和学习
但是,真的很少有人主动去看
https://rpg.blue/thread-379188-1-1.html
感谢版主,就是那个R开头的什么什么记不住的一串英文,经常塞塘给大家的人

点评

看过,只是看不懂  发表于 2015-8-22 11:44
赞同R君,不好记  发表于 2015-5-26 17:19
to RyanBern :嗯 (๑•́ ₃ •̀๑)  发表于 2015-5-26 09:16
我的论坛ID就那么不好记吗TAT  发表于 2015-5-26 09:08

评分

参与人数 2星屑 +32 收起 理由
VIPArcher + 16 就是那个R开头的什么什么记不住的一串英文.
kuerlulu + 16 手滑

查看全部评分

初从文,三年不中;后习武,校场发一矢,中鼓吏,逐之出;遂学医,有所成。自撰一良方,服之,卒。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
150
在线时间
332 小时
注册时间
2013-7-6
帖子
356
3
发表于 2015-5-26 02:27:26 | 只看该作者
本帖最后由 wolves 于 2015-5-26 02:29 编辑

恩,@开头的变量叫做实变量,有效范围为实例内部,一般可作为实例的属性供其它部分脚本调用。它的本质是个变量,ruby里变量直接赋值就可以用,一般我们赋值都在initialize方法里写,具体可以去看下class与def相关的内容。想用实例.实变量名读取这个变量可以定义一个方法
def 变量名
  return @变量名
end
以上可以简写为attr_reader :变量名
修改这个变量也是通过定义方法
def 变量名=(value)
  @变量名=value
end
以上可以简写为attr_writer :变量名
上面两个方法综合起来可以简写为attr_accessor :变量名
具体类和方法详见论坛教程哦,例子很多
注意,attr_开头的是方法,参数是变量名的符号,要理解

评分

参与人数 2星屑 +105 收起 理由
RyanBern + 90 塞糖
白鬼 + 15 我都怀疑酱紫讲给楼主楼主能不能明白.

查看全部评分

偶是熬夜学编程的傻子
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
143
在线时间
62 小时
注册时间
2015-5-24
帖子
56
4
 楼主| 发表于 2015-5-26 18:21:22 | 只看该作者
wolves 发表于 2015-5-26 02:27
恩,@开头的变量叫做实变量,有效范围为实例内部,一般可作为实例的属性供其它部分脚本调用。它的本质是个 ...

- -表示这位大神没有在脚本新手教程里讲得详细.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
143
在线时间
62 小时
注册时间
2015-5-24
帖子
56
5
 楼主| 发表于 2015-5-26 18:25:31 | 只看该作者
wolves 发表于 2015-5-26 02:27
恩,@开头的变量叫做实变量,有效范围为实例内部,一般可作为实例的属性供其它部分脚本调用。它的本质是个 ...

实变量是否可以直接定义?
还是要使用attr_accessor :变量名 来定义?
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9497
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

6
发表于 2015-5-26 20:00:30 | 只看该作者
本帖最后由 RyanBern 于 2015-5-26 20:01 编辑

以'@'开头的变量,叫做实变量,它和一般临时变量不同的是,它永远是对象的一部分,只要对象存在,相应的实变量就会一直存在。

实变量使用时不需要声明,也就是说你想用什么实变量直接把它名字调出来就好了。未经赋初值的实变量的值是nil。
RUBY 代码复制
  1. class A
  2.   def initialize
  3.     @x = 0
  4.     @y = 0
  5.   end
  6.   def show
  7.     p @x, @y
  8.   end
  9. end
  10.  
  11. a = A.new
  12. a.show # => 0, 0

当然,这样定义的实变量只能在对象内部使用,也就是使用的地方必须在同一个类里面。换言之,如果在对象的外部访问实变量,是无法访问到的。
外界无法访问实变量有一定的好处,那就是可以保护数据,体现封装的安全性。但是也有很多时候,我们需要从对象外面访问相应的实变量。这个时候,我们就必须定义两个方法。
RUBY 代码复制
  1. class A
  2.   def initialize
  3.     @x = 0
  4.     @y = 0
  5.   end
  6.   def show
  7.     p @x, @y
  8.   end
  9.   def x
  10.     return @x
  11.   end
  12.   def x=(val)
  13.     @x = val
  14.   end
  15. end

请注意我们新加入的两个方法,这两个方法是对实变量@x进行操作,其中,def x这个方法是返回@x本身的值,而def x=(val)这个方法是修改@x的值。有了这两个方法,我们就可以在对象外部调用了:
RUBY 代码复制
  1. a = A.new
  2. p a.x #=> 0
  3. a.x = 1
  4. p a.x #=>1

请注意,原点运算符'.'的含义是调用该对象的方法,而不是访问对象@x的值或者修改@x的值,这点一定要注意。只不过,在这个例子里面,调用的两个方法'x'和'x='的作用恰恰是访问@x的值和改变@x的值而已。
不过,利用这种方法定义出来的对象,使用起来比较方便,又符合人们正常的认知习惯,所以,我们在使用实变量的时候,通常都会定义这两个方法,一个方法用于读取与该实变量有关的数据,也称之为get访问器,它的名字通常为实变量的名字(去掉'@');而另一个方法用于设置与该实变量有关的数据,也称之为set访问器,它的名字通常为实变量名字在加上'='符号。凡是定义了这两个方法(或者其中一个)而且作用又和某个实变量想关联的符号,我们称之为【属性】,【属性】是表示对象的某个方面的状态,这也比较符合我们认识世界的方法。
继续上面的例子,我们追加以下定义:
RUBY 代码复制
  1. class A
  2.   def y
  3.     return @y
  4.   end
  5.   def y=(val)
  6.     val = [[val, 0].max, 99].min
  7.     @y = val
  8.   end
  9. end

注意在这里我们定义的'y='方法,和上面的'x='方法稍有区别。接下来我们试一下:
RUBY 代码复制
  1. a = A.new
  2. a.y = 10
  3. p a.y #=>10
  4. a.y = -1
  5. p a.y #=> 0
  6. a.y = 100
  7. p a.y #=>99
  8. a.instance_variable_set(:@y, -1)
  9. p a.y #=>-1

我们看到,在这里,如果直接调用 a.y = 数值,那么@y的值并不是直接变成右面的数值,而是只能变为0~99中的数,这是因为'y='方法不再像'x='方法那样,简单改变@y的值,而是做了比较复杂的工作。而最后那一句a.instance_variable_set(:@y, -1)才是直接改变@y的数值,现在可以忽略这个地方。
最后,我想说一下下面这三个东西:
attr_accessor
attr_reader
attr_writer
这三个东西不知道有多少人会理解错误。先说说这三个家伙是什么吧,它们都是Module类的方法(如果不能理解什么是Module,那么要记住他们是【方法】),后面跟的参数是符号(Symbol)参数。它们的作用是根据给定的符号参数,来定义某些实例方法。
有一种理解是认为这三个东西是用于声明实变量的,这种理解方式是不对的。我们在一开始就说了,实变量不需要声明就可以使用,那么,何谈【声明实变量】这一说?
我们应该把这三个方法理解成【生成方法的方法】。
如果在class A下,写attr_accessor(:x)
这一句话是根据符号':x'生成两个方法,'x'和'x=',而生成的这两个方法的方法体,就是下面这样子:
RUBY 代码复制
  1. def x
  2.   return @x
  3. end
  4. def x=(val)
  5.   @x = val
  6. end

这不就是我们刚才第一遍给A类加方法的代码吗?对,attr_accessor(:x)的含义就是上面那几行代码。它为实变量@x提供了最基本也是最初等的get/set访问器。所以,当实变量较多而又需要外部引用的时候,用一个attr_accessor方法,就可以同时定义两个方法,代码是不是很简洁呢?而attr_reader方法,只定义了get访问器;attr_writer方法,只定义了set访问器,所以在使用的时候要根据需求,虽然attr_accessor定义的方法是两个,但是也不能什么实变量都用吧。
至于@后面跟中文字符的实变量,应该尽量避免,虽然它们所起的作用和正常的实变量没什么区别。

点评

唉,没时间写详细了- - 半夜用手机写的  发表于 2015-5-26 22:47
其实,感觉新人每次问的东西都是差不多的,而且这样的教程也已经收录在图书馆了,不过这个可以作为图书馆2F的“常见问题”的内容  发表于 2015-5-26 20:11
我说,你把所有回答新人的这些总结起来,可以弄个详细的初级教程了。  发表于 2015-5-26 20:07

评分

参与人数 2星屑 +540 收起 理由
taroxd + 300 实例变量本来就挺坑新人的
VIPArcher + 240 听说没人给你发糖=。=

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

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

开拓者

7
发表于 2015-6-1 14:15:08 | 只看该作者
@a是实例变量,同一个对象的同名实例变量是同一个量。
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-26 03:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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