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

Project1

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

@name变量定义问题

 关闭 [复制链接]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-10-26
帖子
110
跳转到指定楼层
1
发表于 2008-12-28 23:02:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

Lv1.梦旅人

B

梦石
0
星屑
50
在线时间
26 小时
注册时间
2007-8-26
帖子
3693
2
发表于 2008-12-28 23:17:41 | 只看该作者
屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
299
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

3
发表于 2008-12-28 23:37:56 | 只看该作者
既然都使用了 [1] 这个了, 就说明就数组了。

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

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




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

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

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-10-26
帖子
110
4
 楼主| 发表于 2008-12-28 23:56:04 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
299
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

5
发表于 2008-12-29 00:01:40 | 只看该作者
以下引用消隐于2008-12-28 15:56:04的发言:

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


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

嘛, proc 也是可以的~~~

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-10-26
帖子
110
6
 楼主| 发表于 2008-12-29 00:34:11 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-10-26
帖子
110
7
 楼主| 发表于 2009-1-1 04:19:28 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

小柯的徒弟

梦石
0
星屑
1535
在线时间
1157 小时
注册时间
2008-5-24
帖子
3085

贵宾

8
发表于 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中

====
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-10-26
帖子
110
9
 楼主| 发表于 2009-1-1 18:22:14 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

小柯的徒弟

梦石
0
星屑
1535
在线时间
1157 小时
注册时间
2008-5-24
帖子
3085

贵宾

10
发表于 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感谢您的热情解答~
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-19 22:07

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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