Project1

标题: @name变量定义问题 [打印本页]

作者: 消隐    时间: 2008-12-28 23:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: ONEWateR    时间: 2008-12-28 23:17
屏蔽
作者: 八云紫    时间: 2008-12-28 23:37
既然都使用了 [1] 这个了, 就说明就数组了。

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

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

[LINE]1,#dddddd[/LINE]

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

么的,真正使用的这些方法的,是由这个类的实例来使用的。
作者: 消隐    时间: 2008-12-28 23:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: 八云紫    时间: 2008-12-29 00:01
以下引用消隐于2008-12-28 15:56:04的发言:

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


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

嘛, proc 也是可以的~~~
作者: 消隐    时间: 2008-12-29 00:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: 消隐    时间: 2009-1-1 04:19
提示: 作者被禁止或删除 内容自动屏蔽
作者: 「旅」    时间: 2009-1-1 13:58
以下引用消隐于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中

====
作者: 消隐    时间: 2009-1-1 18:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: 「旅」    时间: 2009-1-1 21: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)

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




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1