加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 taroxd 于 2014-3-23 07:59 编辑
嘛我是一个很懒的人,总是不想写重复的脚本,比如说alias。
这个脚本的作用是:自动定义读取数据库备注的方法(类似attr_reader),为读取的内容缓存并检查重名。
使用此脚本不需要任何正则表达式相关知识
使用说明:直接给出范例
这是我的备注
角色2没有备注任何东西
要读取这段备注,使用的脚本如下
class RPG::Actor # 读取角色的备注。这里的类可以是任意带有备注的类 # 定义了读取备注的方法 # 本系列所有方法,均读取备注中的这样一段 # <方法名 读取内容> # 其中,方法名要截去末尾的!和?,并会自动将所有下划线替换成空格。大小写不敏感 # note_s 读取内容是字符串 # 预期的备注示例 <name is Eric> # 后面的false是设置默认值,表示当没有读取到预期的备注时,方法返回false # 如果不设置默认值,那么方法会返回一个空字符串 note_s :name_is, false # note_bool 返回一个布尔值 # 预期的备注示例 <male> note_bool :male? # 下面两者分别用来读取整数和小数,不显式设置默认值的话,会返回0和0.0。 note_i :age note_f :weight # 注意事项 # 1. 默认值不能设为 nil,如果需要表示什么都没有,请设置为 false # 2. 不要和已有方法重名 错误示例: note_s :name # 3. 默认值请设为Ruby内置的类型,不要用自己定义的对象。除非你完全清楚这个脚本实现的原理。 end # 脚本到此结束,以下为测试部分 $data_actors = load_data("Data/Actors.rvdata2") data1 = $data_actors[1] data2 = $data_actors[2] # 注释为输出的结果 puts data1.name_is # Eric puts data1.male? # true puts data1.age # 25 puts data1.weight # 100.07 puts data2.name_is # false puts data2.male? # false puts data2.age # 0 puts data2.weight # 0.0 rgss_stop
class RPG::Actor # 读取角色的备注。这里的类可以是任意带有备注的类
# 定义了读取备注的方法
# 本系列所有方法,均读取备注中的这样一段
# <方法名 读取内容>
# 其中,方法名要截去末尾的!和?,并会自动将所有下划线替换成空格。大小写不敏感
# note_s 读取内容是字符串
# 预期的备注示例 <name is Eric>
# 后面的false是设置默认值,表示当没有读取到预期的备注时,方法返回false
# 如果不设置默认值,那么方法会返回一个空字符串
note_s :name_is, false
# note_bool 返回一个布尔值
# 预期的备注示例 <male>
note_bool :male?
# 下面两者分别用来读取整数和小数,不显式设置默认值的话,会返回0和0.0。
note_i :age
note_f :weight
# 注意事项
# 1. 默认值不能设为 nil,如果需要表示什么都没有,请设置为 false
# 2. 不要和已有方法重名 错误示例: note_s :name
# 3. 默认值请设为Ruby内置的类型,不要用自己定义的对象。除非你完全清楚这个脚本实现的原理。
end
# 脚本到此结束,以下为测试部分
$data_actors = load_data("Data/Actors.rvdata2")
data1 = $data_actors[1]
data2 = $data_actors[2]
# 注释为输出的结果
puts data1.name_is # Eric
puts data1.male? # true
puts data1.age # 25
puts data1.weight # 100.07
puts data2.name_is # false
puts data2.male? # false
puts data2.age # 0
puts data2.weight # 0.0
rgss_stop
脚本的实现:
module RPG module Notable #------------------------------------------------------------------------ # ● 任意备注 #------------------------------------------------------------------------ def note_any(name, default, re, capture) raise ArgumentError, "default can't be nil" if default.nil? name = name.to_s mark = name.slice!(/[?!]\Z/) if method_defined? name message = "already defined method `#{name}' for #{self}" raise NameError.new(message, name.to_sym) end re = "/<#{name.gsub(/_/, '\s*')}#{re.source}>/i" default = default.inspect class_eval %{ def #{name} return @#{name} unless @#{name}.nil? @#{name} = @note =~ #{re} ? (#{capture}) : (#{default}) end } alias_method name + mark, name if mark end #------------------------------------------------------------------------ # ● 备注整数 #------------------------------------------------------------------------ def note_i(name, default = 0) note_any(name, default, /\s*(-?\d+)/, '$1.to_i') end #------------------------------------------------------------------------ # ● 备注小数 #------------------------------------------------------------------------ def note_f(name, default = 0.0) note_any(name, default, /\s*(-?\d+(?:\.\d+)?)/, '$1.to_f') end #------------------------------------------------------------------------ # ● 备注字符串 #------------------------------------------------------------------------ def note_s(name, default = '') note_any(name, default, /\s*(\S.*)/, '$1') end #------------------------------------------------------------------------ # ● 备注是否匹配 #------------------------------------------------------------------------ def note_bool(name) note_any(name, false, //, 'true') end end BaseItem.extend Notable Map.extend Notable Tileset.extend Notable end
module RPG
module Notable
#------------------------------------------------------------------------
# ● 任意备注
#------------------------------------------------------------------------
def note_any(name, default, re, capture)
raise ArgumentError, "default can't be nil" if default.nil?
name = name.to_s
mark = name.slice!(/[?!]\Z/)
if method_defined? name
message = "already defined method `#{name}' for #{self}"
raise NameError.new(message, name.to_sym)
end
re = "/<#{name.gsub(/_/, '\s*')}#{re.source}>/i"
default = default.inspect
class_eval %{
def #{name}
return @#{name} unless @#{name}.nil?
@#{name} = @note =~ #{re} ? (#{capture}) : (#{default})
end
}
alias_method name + mark, name if mark
end
#------------------------------------------------------------------------
# ● 备注整数
#------------------------------------------------------------------------
def note_i(name, default = 0)
note_any(name, default, /\s*(-?\d+)/, '$1.to_i')
end
#------------------------------------------------------------------------
# ● 备注小数
#------------------------------------------------------------------------
def note_f(name, default = 0.0)
note_any(name, default, /\s*(-?\d+(?:\.\d+)?)/, '$1.to_f')
end
#------------------------------------------------------------------------
# ● 备注字符串
#------------------------------------------------------------------------
def note_s(name, default = '')
note_any(name, default, /\s*(\S.*)/, '$1')
end
#------------------------------------------------------------------------
# ● 备注是否匹配
#------------------------------------------------------------------------
def note_bool(name)
note_any(name, false, //, 'true')
end
end
BaseItem.extend Notable
Map.extend Notable
Tileset.extend Notable
end
|