查看: 4165|回复: 4

[RMVA发布] 【把偷懒进行到底】读取备注栏信息

[复制链接]

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-3-21 17:11:46 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 taroxd 于 2014-3-23 07:59 编辑

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

使用说明:直接给出范例
这是我的备注
搜狗截图_2014-03-21_16-49-17.png
角色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]

评分

参与人数 1星屑 +200 梦石 +1 收起 理由
怪蜀黍 + 200 + 1 发布奖励

查看全部评分

梦石
0
星屑
60
在线时间
350 小时
注册时间
2012-7-25
回帖
118
发表于 2014-3-21 17:26:04 来自手机 | 显示全部楼层
把所有数据库的都写上吧......

点评

什么意思  发表于 2014-3-21 17:39
回复

使用道具 举报

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2014-3-22 18:37:17 | 显示全部楼层

点评

嘛我更喜欢自己的格式,只是顺便发出来而已。另外两者的思路完全不一样吧  发表于 2014-3-22 20:16
回复

使用道具 举报

梦石
0
星屑
65
在线时间
154 小时
注册时间
2011-2-1
回帖
41
发表于 2014-3-29 16:40:36 | 显示全部楼层
作为初心者,至少第一个我看懂了。。。。
复制走研究去

点评

第二个看不懂没关系,扔在那里用就行  发表于 2014-3-29 16:45
回复

使用道具 举报

梦石
0
星屑
1225
在线时间
564 小时
注册时间
2014-11-30
回帖
126
发表于 2015-9-7 23:06:49 | 显示全部楼层
我看到你的读取角色备注的脚本,我想在66RPG上的那个套装=武器的脚本里面,设置套装属性也可以读取武器上的备注,需要怎么写呢,我不会写,就是他的套装属性其实是读取武器的属性,能不能也可以读取武器上的备注呢,能不能帮我修改一下,万分感谢,我非常需要
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部