| 赞 | 72 |
| VIP | |
| 好人卡 | |
| 积分 | 23 |
| 经验 | |
| 最后登录 | 2022-3-9 |
| 在线时间 | 4033 小时 |
…あたしは天
- 梦石
- 0
- 星屑
- 2308
- 在线时间
- 4033 小时
- 注册时间
- 2010-10-4
- 回帖
- 10548
 
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 taroxd 于 2014-3-23 07:59 编辑
嘛我是一个很懒的人,总是不想写重复的脚本,比如说alias。
这个脚本的作用是:自动定义读取数据库备注的方法(类似attr_reader),为读取的内容缓存并检查重名。
使用此脚本不需要任何正则表达式相关知识
使用说明:直接给出范例
这是我的备注
角色2没有备注任何东西
要读取这段备注,使用的脚本如下
[pre lang="ruby" line="1"]
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
[/pre]
脚本的实现:
[pre lang="ruby" line="1"]
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[/pre] |
评分
-
查看全部评分
|