Project1

标题: 【把偷懒进行到底】读取备注栏信息 [打印本页]

作者: taroxd    时间: 2014-3-21 17:11
标题: 【把偷懒进行到底】读取备注栏信息
本帖最后由 taroxd 于 2014-3-23 07:59 编辑

嘛我是一个很懒的人,总是不想写重复的脚本,比如说alias
这个脚本的作用是:自动定义读取数据库备注的方法(类似attr_reader),为读取的内容缓存并检查重名。
使用此脚本不需要任何正则表达式相关知识

使用说明:直接给出范例
这是我的备注

角色2没有备注任何东西

要读取这段备注,使用的脚本如下
RUBY 代码复制
  1. class RPG::Actor  # 读取角色的备注。这里的类可以是任意带有备注的类
  2.   # 定义了读取备注的方法
  3.   # 本系列所有方法,均读取备注中的这样一段
  4.   # <方法名 读取内容>
  5.   # 其中,方法名要截去末尾的!和?,并会自动将所有下划线替换成空格。大小写不敏感
  6.  
  7.   # note_s 读取内容是字符串
  8.   # 预期的备注示例 <name is Eric>
  9.   # 后面的false是设置默认值,表示当没有读取到预期的备注时,方法返回false
  10.   # 如果不设置默认值,那么方法会返回一个空字符串
  11.   note_s :name_is, false
  12.  
  13.   # note_bool 返回一个布尔值
  14.   # 预期的备注示例 <male>
  15.   note_bool :male?
  16.  
  17.   # 下面两者分别用来读取整数和小数,不显式设置默认值的话,会返回0和0.0。
  18.   note_i :age
  19.   note_f :weight
  20.  
  21.   # 注意事项
  22.   #    1. 默认值不能设为 nil,如果需要表示什么都没有,请设置为 false
  23.   #    2. 不要和已有方法重名  错误示例: note_s :name
  24.   #    3. 默认值请设为Ruby内置的类型,不要用自己定义的对象。除非你完全清楚这个脚本实现的原理。
  25. end
  26.  
  27. # 脚本到此结束,以下为测试部分
  28.  
  29. $data_actors = load_data("Data/Actors.rvdata2")
  30. data1 = $data_actors[1]
  31. data2 = $data_actors[2]
  32.  
  33. # 注释为输出的结果
  34.  
  35. puts data1.name_is  # Eric
  36. puts data1.male?    # true
  37. puts data1.age      # 25
  38. puts data1.weight   # 100.07
  39.  
  40. puts data2.name_is  # false
  41. puts data2.male?    # false
  42. puts data2.age      # 0
  43. puts data2.weight   # 0.0
  44.  
  45. rgss_stop


脚本的实现:
RUBY 代码复制
  1. module RPG
  2.   module Notable
  3.     #------------------------------------------------------------------------
  4.     # ● 任意备注
  5.     #------------------------------------------------------------------------
  6.     def note_any(name, default, re, capture)
  7.       raise ArgumentError, "default can't be nil" if default.nil?
  8.       name = name.to_s
  9.       mark = name.slice!(/[?!]\Z/)
  10.       if method_defined? name
  11.         message = "already defined method `#{name}' for #{self}"
  12.         raise NameError.new(message, name.to_sym)
  13.       end
  14.       re = "/<#{name.gsub(/_/, '\s*')}#{re.source}>/i"
  15.       default = default.inspect
  16.       class_eval %{
  17.         def #{name}
  18.           return @#{name} unless @#{name}.nil?
  19.           @#{name} = @note =~ #{re} ? (#{capture}) : (#{default})
  20.         end
  21.       }
  22.       alias_method name + mark, name if mark
  23.     end
  24.     #------------------------------------------------------------------------
  25.     # ● 备注整数
  26.     #------------------------------------------------------------------------
  27.     def note_i(name, default = 0)
  28.       note_any(name, default, /\s*(-?\d+)/, '$1.to_i')
  29.     end
  30.     #------------------------------------------------------------------------
  31.     # ● 备注小数
  32.     #------------------------------------------------------------------------
  33.     def note_f(name, default = 0.0)
  34.       note_any(name, default, /\s*(-?\d+(?:\.\d+)?)/, '$1.to_f')
  35.     end
  36.     #------------------------------------------------------------------------
  37.     # ● 备注字符串
  38.     #------------------------------------------------------------------------
  39.     def note_s(name, default = '')
  40.       note_any(name, default, /\s*(\S.*)/, '$1')
  41.     end
  42.     #------------------------------------------------------------------------
  43.     # ● 备注是否匹配
  44.     #------------------------------------------------------------------------
  45.     def note_bool(name)
  46.       note_any(name, false, //, 'true')
  47.     end
  48.   end
  49.   BaseItem.extend Notable
  50.   Map.extend      Notable
  51.   Tileset.extend  Notable
  52. end

作者: czh098tom    时间: 2014-3-21 17:26
把所有数据库的都写上吧......
作者: 喵呜喵5    时间: 2014-3-22 18:37
VX、VA通用
http://rpg.blue/thread-99474-1-1.html
作者: tai_tan    时间: 2014-3-29 16:40
作为初心者,至少第一个我看懂了。。。。
复制走研究去
作者: 309988769    时间: 2015-9-7 23:06
我看到你的读取角色备注的脚本,我想在66RPG上的那个套装=武器的脚本里面,设置套装属性也可以读取武器上的备注,需要怎么写呢,我不会写,就是他的套装属性其实是读取武器的属性,能不能也可以读取武器上的备注呢,能不能帮我修改一下,万分感谢,我非常需要




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