查看: 1261|回复: 9

@name变量定义问题

  [复制链接]
头像被屏蔽
梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-10-26
回帖
84
发表于 2008-12-28 23:02:53 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

B

梦石
0
星屑
50
在线时间
26 小时
注册时间
2007-8-26
回帖
3622
发表于 2008-12-28 23:17:41 | 显示全部楼层
屏蔽
回复

使用道具 举报

神隐的主犯

梦石
0
星屑
553
在线时间
271 小时
注册时间
2008-2-22
回帖
7534

贵宾

发表于 2008-12-28 23:37:56 | 显示全部楼层
既然都使用了 [1] 这个了, 就说明就数组了。

数组里的每个元素都是 Game_Actors 的实例, 每个实例的 @name 变量都是互不干扰的。

你改变了 一个实例的 @name ,但是对其他的 实例 的 @name 不会产生影响。




例外, 使用 class 来定义类的时候,其实定义的只是类的属性,比如 变量, 方法什

么的,真正使用的这些方法的,是由这个类的实例来使用的。

《天空之城 —— 破碎的命运》
回复

使用道具 举报

头像被屏蔽
梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-10-26
回帖
84
 楼主| 发表于 2008-12-28 23:56:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

神隐的主犯

梦石
0
星屑
553
在线时间
271 小时
注册时间
2008-2-22
回帖
7534

贵宾

发表于 2008-12-29 00:01:40 | 显示全部楼层
以下引用消隐于2008-12-28 15:56:04的发言:

那么怎么给一个类的实例设置属性啊?


一般都是在定义类的时候就设定好了。 不过也可以使用 匿名类 来为一个实例来添加方法~。

嘛, proc 也是可以的~~~

《天空之城 —— 破碎的命运》
回复

使用道具 举报

头像被屏蔽
梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-10-26
回帖
84
 楼主| 发表于 2008-12-29 00:34:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-10-26
回帖
84
 楼主| 发表于 2009-1-1 04:19:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

小柯的徒弟

梦石
0
星屑
1925
在线时间
1157 小时
注册时间
2008-5-24
回帖
2994

贵宾

发表于 2009-1-1 13:58:45 | 显示全部楼层
以下引用消隐于2008-12-28 15:56:04的发言:

那么怎么给一个类的实例设置属性啊?

def name
return @name
end
def name=(name)
@name = name
end
如上,第一个方法为"取得@name",好比你在类中某处写上
n = name 的效果和 n = @name 一样
n = name 就是取得name方法的返回值,也就是取得@name的值

第二个方法为"设置@name",在某处写上
name=999
p @name
你会发现@name为999,其实name=999并不是变量,而是方法,附:参数可以不带括号的来使用
Q:为何需定义这些方法
A:因为在外部不可以像类中可以直接@name = 546 或者取得类中的@name。所以,这些方法定义后便可以顺意的拿到类中变量

attr_accessor :@name
如上就可以直接定义了上面的那两个方法
attr_reader :@name # 只定义了第一个
attr_writer :@name # 只定义了第二个


以下引用消隐于2008-12-28 15:02:53的发言:

明明只定义了一次@name,请问这无数个@name是哪里来的?是什么时候定义的?

说白了就是定义了多个类
Game_Actors中有一句

====

def [](actor_id)
  if actor_id > 999 or $data_actors[actor_id] == nil  # 这个循环可以无视
    return nil                                        # 只是用于避免错误发生
  end                                                 # 只要你不乱改数据库文件= =
  if @data[actor_id] == nil  # 如果@data为nil,也就是说还没有这个角色的类
   @data[actor_id] = Game_Actor.new(actor_id) # 生成类,生成时会自动代入角色数据到变量中
  end
    return @data[actor_id] # 最后,返回@data中,属于actor_id编号角色的类
  end             # 好比返回Game_Actor.new(actor_id)
end              # 但是,数据是一直保留的,类需要一直保存,所以才要一直保留在@data中

====
回复

使用道具 举报

头像被屏蔽
梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-10-26
回帖
84
 楼主| 发表于 2009-1-1 18:22:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

小柯的徒弟

梦石
0
星屑
1925
在线时间
1157 小时
注册时间
2008-5-24
回帖
2994

贵宾

发表于 2009-1-1 21:16:16 | 显示全部楼层
首先设置一个 初始化-实变量 的类
class A
attr_accessor :a
def initialize(number)
  case number
    when 1
      @a = 99
    when 2
      @a = 100
  end
end
end

然后直接复制 Game_Actors 并把复制内容的 类名改为成自己想要的

把下段删除,毕竟他只是来避免出错,而实际上只要把脚本写好是不会出错的,不需要下段内容
if actor_id > 999 or $data_actors[actor_id] == nil
      return nil
    end

再把24行的  Game_Actor.new(actor_id) 改为 A.new(actor_id)

最后生成 这个复制的类 即可
系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部