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

Project1

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

[已经解决] 我想问一下@实变量是什么意思?

[复制链接]

Lv4.逐梦者

【欧皇】

梦石
3
星屑
2035
在线时间
1004 小时
注册时间
2013-8-19
帖子
3486

开拓者

跳转到指定楼层
1
发表于 2014-12-30 22:01:57 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
F1教程里的看不懂,说什么对象什么什么的
能不能举一个简单的例子(要脚本新手能看得懂的)。
QQ:2223942063
Q群:365819625
贪吃方1.4

Lv1.梦旅人

梦石
0
星屑
52
在线时间
704 小时
注册时间
2011-12-27
帖子
941
13
发表于 2015-1-2 08:59:19 | 只看该作者
欧买歌 发表于 2015-1-1 21:02
那么_变量又是什么鬼?

以_開頭的其實是一些人用寫類的私有變量時的寫法, 在不同的語言都有人這樣的表達.
其實寫出來給自己知道這是個私有的變量, 解析器是看不懂的.
而且個人也不太喜歡這種寫法, 所以結論是可以無視
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

12
发表于 2015-1-2 07:44:37 | 只看该作者
本帖最后由 taroxd 于 2015-1-2 07:48 编辑
寒冷魔王 发表于 2015-1-2 00:34
@实例变量 与 @@类变量 的作用域是不同的。实例变量是在类new(实例)的时候被创建,而类变量是该类作为Class ...


实例变量并不一定是在 new 的时候创建的,反例见7L

要个更加典型的反例的话

RUBY 代码复制
  1. module SceneManager
  2.   [url=home.php?mod=space&uid=420706]@Scene[/url] = nil
  3.   @stack = nil
  4.   # ...
  5. end


或者

RUBY 代码复制
  1. module Cache
  2.   def self.load_bitmap
  3.     [url=home.php?mod=space&uid=341345]@Cache[/url] ||= {}
  4.   end
  5. end


RUBY 代码复制
  1. class C
  2.   def some_attribute
  3.     @some_attribute ||= []
  4.   end
  5. end



类变量和实例变量的主要区别在于作用域不同。本类及其子类,还有本类及其子类的实例中都可以访问到。因为可能被子类随意修改所以不建议使用。

---

就我个人而言,我总是会把实例变量和 self 关联在一起,根据 self 判断当前访问的是哪个对象的实例变量。
类变量嘛……从来不用,总是用类实例变量或者常量代替。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1024
在线时间
1389 小时
注册时间
2010-8-9
帖子
3471
11
发表于 2015-1-2 00:34:01 | 只看该作者
本帖最后由 寒冷魔王 于 2015-1-2 00:47 编辑

@实例变量 与 @@类变量 的作用域是不同的。实例变量是在类new(实例)的时候被创建,而类变量是该类作为Class类对象时的特征变量。
比如:
  1. class C
  2.         @[url=home.php?mod=space&uid=16629]@HELLO[/url] = "Hello"
  3.         def initialize
  4.                 [url=home.php?mod=space&uid=16629]@HELLO[/url] = "Hi"
  5.         end
  6.         class << self
  7.                 def hello
  8.                         puts "There is in self.hello"
  9.                         puts "@[url=home.php?mod=space&uid=16629]@HELLO[/url] = #{@@hello}"
  10.                         puts "@hello = #{@hello}"
  11.                 end
  12.         end
  13.         def hello
  14.                 puts "There is in hello"
  15.                 puts "@@hello = #{@@hello}"
  16.                 puts "@hello = #{@hello}"
  17.         end
  18. end
  19. C.hello
  20. C.new.hello
复制代码
另外在class<<self内也可以定义实例变量,但那又存在一个新的作用域。相当于类的类实例变量。(好复杂)  
SRPG on RM 项目研发组 正式成立。目前SRPG·RMVA系统进度88.8%。SMRC Kernel 进度90%
↖(^ω^)↗热烈庆祝~SMRC Ver5.1 SRPG战棋地图移动范围生成脚本正式发布~~
-----------------------------------------------------------------------------------------
SMRC具有高性能、高兼容、定制自由、使用方便的特点。
1.性能,100移动力轻松算出,无压力;
2.兼容,RGSS1-3通吃,效率保证;
3.支持移动形状定制,支持4方位、6方位、正方形或其他任意有移动规律的形状;
4.可以充当高性能寻路来使用。
【链接点此】
-----------------------------------------------------------------------------------------
【2016/01/06更新 | 改版】RM脚本编辑器Gemini
-----------------------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
389 小时
注册时间
2009-11-24
帖子
71
10
发表于 2015-1-1 22:13:28 | 只看该作者
本帖最后由 test 于 2015-1-1 22:31 编辑
欧买歌 发表于 2015-1-1 21:02
那么_变量又是什么鬼?


没注意看前面有个下划线...

点评

没见过这种类型的变量。但变量的名字可以以下划线开头…… _xxx就是一般的变量,$_xxx是全局变量,@_xxx是实例变量,@@_xxx是类变量。  发表于 2015-1-1 22:23
我说的是_变量,就是_后面的变量  发表于 2015-1-1 22:17
回复 支持 反对

使用道具 举报

Lv4.逐梦者

【欧皇】

梦石
3
星屑
2035
在线时间
1004 小时
注册时间
2013-8-19
帖子
3486

开拓者

9
 楼主| 发表于 2015-1-1 21:02:37 | 只看该作者
test 发表于 2015-1-1 18:55
请试着理解下面代码:

# 定义了一个全局变量$c,并使它的值等于333的函数。

那么_变量又是什么鬼?
QQ:2223942063
Q群:365819625
贪吃方1.4
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
92 小时
注册时间
2014-12-19
帖子
111
8
发表于 2015-1-1 20:36:27 | 只看该作者
@被称为实例变量,每一个对象在被创建时继承了类里实例变量的初始值,对象与对象之间的实例变量是独立的。

点评

"每一个对象在被创建时继承了类里实例变量的初始值" 何解?  发表于 2015-1-1 20:48
X
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

7
发表于 2015-1-1 20:27:48 | 只看该作者
本帖最后由 taroxd 于 2015-1-1 20:29 编辑

RUBY 代码复制
  1. obj = Object.new
  2. obj.instance_variable_set(:@ivar, obj)
  3. p obj # =>  #<Object:0x00000002cd5008 @ivar=#<Object:0x00000002cd5008 ...>>
  4. p obj.instance_variable_get(:@ivar) # => #<Object:0x00000002cd5008 @ivar=#<Object:0x00000002cd5008 ...>>
  5.  
  6. def obj.sell_moe
  7.   p @ivar
  8. end
  9.  
  10. obj.sell_moe # => #<Object:0x00000002cd5008 @ivar=#<Object:0x00000002cd5008 ...>>
  11. obj.sell_moe.sell_moe.sell_moe
  12. # =>
  13. # #<Object:0x00000002cd5008 @ivar=#<Object:0x00000002cd5008 ...>>
  14. # #<Object:0x00000002cd5008 @ivar=#<Object:0x00000002cd5008 ...>>
  15. # #<Object:0x00000002cd5008 @ivar=#<Object:0x00000002cd5008 ...>>


匿了 {:8_462:}

点评

O O原来这样,没注意到唉~我又不小心被萌到了~  发表于 2015-1-2 12:16
↓ 我方法名都叫 sell_moe 了- -  发表于 2015-1-2 12:15
哇~好萌~不小心被萌到了~  发表于 2015-1-2 12:08
- - 我在卖萌啦  发表于 2015-1-2 07:40
元编程用得太多了,有点RoR的感觉  发表于 2015-1-2 00:38
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
389 小时
注册时间
2009-11-24
帖子
71
6
发表于 2015-1-1 18:55:47 | 只看该作者
本帖最后由 test 于 2015-1-1 22:35 编辑
欧买歌 发表于 2015-1-1 18:02
我也不知道


请试着理解下面代码:
RUBY 代码复制
  1. # 定义了一个全局变量$c,并使它的值等于333的函数。
  2. def x()
  3.         $c = 333; #全局变量
  4. end
  5.  
  6. # 测试用的类
  7. class Test
  8.  
  9.         #定义了一个类变量@@a,并使它的值等于111。
  10.         @@a = 111;
  11.  
  12.         #创建实例的时候,会执行这个函数↓
  13.         def initialize(b)
  14.                 @b = b; #定义了实例变量@b,并使它的值等于函数的参数b的值。
  15.         end
  16.  
  17.         #输出类变量@@a的值的函数
  18.         def say_a()
  19.                 p @@a;
  20.         end
  21.         #输出实例变量@b的值的函数
  22.         def say_b()
  23.                 p @b;
  24.         end
  25.         #输出全局变量$c的值的函数
  26.         def say_c()
  27.                 p $c;
  28.         end
  29.         #设置类变量@@a的值的函数
  30.         def set_a(v)
  31.                 @@a = v;
  32.         end
  33.         #设置实例变量@b的值的函数
  34.         def set_b(v)
  35.                 @b = v;
  36.         end
  37. end
  38.  
  39. # 创建两个测试类的实例$t1和$t2。并分别使它们的实例变量@b的值为'222-1'和'222-2'。
  40. $t1 = Test.new('222-1');
  41. $t2 = Test.new('222-2');
  42.  
  43. # ●测试全局变量
  44. # 在函数里使全局变量$c的值为333。
  45. x();
  46. # 使用$t1和$t2中的say_c函数输出全局变量$c的值。
  47. $t1.say_c(); # 输出的值为333
  48. $t2.say_c(); # 输出的值为333
  49. $c = 333; #改变全局变量$c的值为33301
  50. $t1.say_c(); # 输出的值为33301
  51. $t2.say_c(); # 输出的值为33301
  52.  
  53. # ●测试实例变量
  54. # 使用$t1和$t2中的say_b函数输出实例变量@b的值。
  55. $t1.say_b(); # 输出的值为222-1
  56. $t2.say_b(); # 输出的值为222-2
  57. $t1.set_b(444); # 使用$1中的say_b函数,使实例变量@b的值变成444。
  58. $t1.say_b(); # 输出的值为444
  59. $t2.say_b(); # 输出的值为222-2
  60.  
  61. # ●测试类变量
  62. # 使用$t1和$t2中的say_a函数输出类变量@@a的值。
  63. $t1.say_a(); # 输出的值为333
  64. $t2.say_a(); # 输出的值为333
  65. $t1.set_a(555); # 使用$t1中的say_a函数,使类变量@@a的值变成555。
  66. $t1.say_a(); # 输出的值为555
  67. $t2.say_a(); # 输出的值为555
  68.  
  69. # ●它们的区别就在于它们的有效范围,在范围外使用这个变量脚本会出错。
  70. # 全局变量从定义开始,在整个脚本里面任意的地方可以读取,改变它的值。
  71. # 实例变量在实例化之后,各个实例之间它们的值不会相互影响。
  72. # 类变量不实例化,在以这个类创建出来的每一个实例中共用。

点评

语法能看懂吗?比如变量的赋值以及函数的定义和调用之类的语法……  发表于 2015-1-1 19:46
脚本新手表示理解不能……  发表于 2015-1-1 19:10
回复 支持 反对

使用道具 举报

Lv4.逐梦者

【欧皇】

梦石
3
星屑
2035
在线时间
1004 小时
注册时间
2013-8-19
帖子
3486

开拓者

5
 楼主| 发表于 2015-1-1 18:02:09 | 只看该作者
chd114 发表于 2015-1-1 17:20
那么@@、@、$又有什么区别呢?

我也不知道
QQ:2223942063
Q群:365819625
贪吃方1.4
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-14 16:01

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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