赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 1 |
经验 | 423 |
最后登录 | 2013-6-27 |
在线时间 | 2 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 2 小时
- 注册时间
- 2007-5-3
- 帖子
- 151
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 x387804363 于 2009-10-5 13:40 编辑
好吧....这是个不常用的脚本,简单的汉化+合体后加了一个无用的小功能,有需要的就拿去吧,介绍在下面,XPVX通用....
#===========================================================
#Superators --- 添加自定义运算符的脚本 & "增强"require,load
#Superators作者:Jay Phillips 版本:0.9.1 for Ruby
#整合:光的圆周率
#Superators 说明:
#用途:在相应的物件类(Object)中添加自己需要的运算符.
#
#格式为:
#class XXX
# superator "++" do |operand|
# .....
# end
#end
#
#使用方法:
#XXX处为物件类(Object)的名称,比如Array或String
#....处为你所需要的功能的实现代码,operand代表运算符后面的参数,
#self代表运算符前面的参数
#
#比如要实现p "1" ++ "2" #=>"12",对应的代码为:
#
#class String
# superator "++" do |operand|
# self + operand
# end
#end
#
#self + operand等效于:return self + operand
#
#※提示:
#1.不可以重载或重写已存在的运算符,比如 + - * / &
#您可以在网络上搜寻已存在的可重写运算符的重写方法,至于有哪些不可以重写,您可以
#自己试试,脚本会告诉你,此问题可能在今后的版本中得到解决.
#
#2.类似于 ++1 ++"a" 1++2 之类的运算符不能够实现.
#
#3.本脚本在RPG Maker VX 1.02 及 RPG Maker XP 1.03环境下测试通过
#
#4.可以直接使用相对路径来调用require,load,使用方法和Ruby相同,加密后会出错
#===========================================================
说明不是很准确,有问题请直接拍出来
原发布地址:http://rubyforge.org/projects/superators/
完整代码:- #==============================================================================
- #Superators --- 添加自定义运算符的脚本 & "增强"require,load
- #Superators作者:Jay Phillips 版本:0.9.1 for Ruby
- #整理:光的圆周率
- #Superators 说明:
- #用途:在相应的物件类(Object)中添加自己需要的运算符.
- #
- #格式为:
- #class XXX
- # superator "++" do |operand|
- # .....
- # end
- #end
- #
- #使用方法:
- #XXX处为物件类(Object)的名称,比如Array或String
- #....处为你所需要的功能的实现代码,operand代表运算符后面的参数,
- #self代表运算符前面的参数
- #
- #比如要实现p "1" ++ "2" #=>"12",对应的代码为:
- #
- #class String
- # superator "++" do |operand|
- # self + operand
- # end
- #end
- #
- #self + operand等效于:return self + operand
- #
- #※提示:
- #1.不可以重载或重写已存在的运算符,比如 + - * / &
- #您可以在网络上搜寻已存在的可重写运算符的重写方法,至于有哪些不可以重写,您可以
- #自己试试,脚本会告诉你,此问题可能在今后的版本中得到解决.
- #
- #2.类似于 ++1 ++"a" 1++2 之类的运算符不能够实现.
- #
- #3.本脚本在RPG Maker VX 1.02 及 RPG Maker XP 1.03环境下测试通过
- #
- #4.可以直接使用相对路径来调用require,load,使用方法和Ruby相同,加密后会出错
- #==============================================================================
- module SuperatorMain
-
- BINARY_RUBY_OPERATORS = %w"** * / % + - << >> & | ^ <=> >= <= < > === == =~"
- UNARY_RUBY_OPERATORS = %w"-@ ~@ +@"
-
- BINARY_OPERATOR_PATTERN = BINARY_RUBY_OPERATORS.map { |x| Regexp.escape(x) }.join "|"
- UNARY_OPERATOR_PATTERN = UNARY_RUBY_OPERATORS.map { |x| Regexp.escape(x) }.join "|"
- UNARY_OPERATOR_PATTERN_WITHOUT_AT_SIGN = UNARY_OPERATOR_PATTERN.map { |x| x.gsub('@', '') }
-
- VALID_SUPERATOR = /^(#{BINARY_OPERATOR_PATTERN})(#{UNARY_OPERATOR_PATTERN_WITHOUT_AT_SIGN})+$/
- MAJOR,MINOR,TINY = 0,9,1
- VERSION = [MAJOR,MINOR,TINY].join '.'
- def superator_send(sup, operand)
- if respond_to_superator? sup
- __send__ superator_definition_name_for(sup), operand
- else
- raise NoMethodError, "Superator #{sup} 尚未在#{self.class}中定义"
- end
- end
-
- def respond_to_superator?(sup)
- respond_to? superator_definition_name_for(sup)
- end
-
- def defined_superators
- methods.grep(/superator_definition_/).map { |m| superator_decode(m) }
- end
-
- protected
-
- def superator(operator, &block)
- raise ArgumentError, "没有提供块" unless block_given?
- raise ArgumentError, "无效的运算符号!" unless superator_valid?(operator)
-
- real_operator = real_operator_from_superator operator
-
- class_eval do
- # 再老运算符前执行.
- alias_for_real_method = superator_alias_for real_operator
-
- if instance_methods.include?(real_operator) && !respond_to_superator?(operator)
- alias_method alias_for_real_method, real_operator
- end
-
- define_method superator_definition_name_for(operator), &block
-
- # 我们到方法定义的时候, 我们需要知道是否superator运算符有别名或有新的定义
- #
- define_method(real_operator) do |operand|
- if operand.kind_of?(SuperatorFlag) && operand.superator_queue.any?
- sup = operand.superator_queue.unshift(real_operator).join
- operand.superator_queue.clear
-
- superator_send(sup, operand)
- else
- # 如果方法已定义
- if respond_to? alias_for_real_method
- __send__(alias_for_real_method, operand)
- else
- raise NoMethodError, "没有在 #{operand.inspect}:#{operand.class}找到方法:#{real_operator} "
- end
- end
- end
-
- end
-
- def undef_superator(sup)
- if respond_to_superator?(sup)
- real_operator = real_operator_from_superator sup
- real_operator_alias = superator_alias_for sup
-
- (class << self; self; end).instance_eval do
- undef_method superator_definition_name_for(sup)
- if respond_to? real_operator_alias
- alias_method real_operator, real_operator_alias if defined_superators.empty?
- else
- undef_method real_operator
- end
- end
- else
- raise NoMethodError, "没有在 #{self.inspect}:#{self.class}中找到 superator #{sup} "
- end
- end
- end
-
- private
-
- def superator_encode(str)
- tokenizer = /#{BINARY_OPERATOR_PATTERN}|#{UNARY_OPERATOR_PATTERN_WITHOUT_AT_SIGN}/
- str.scan(tokenizer).map { |op| op.split('').map { |s| s[0] }.join "_" }.join "__"
- end
-
- def superator_decode(str)
- tokens = str.match /^(superator_(definition|alias_for))?((_?\d{2,3})+)((__\d{2,3})+)$/
- #输出 *tokens
- if tokens
- (tokens[3].split("_" ) + tokens[5].split('__')).reject { |x| x.empty? }.map { |s| s.to_i.chr }.join
- end
- end
-
- def real_operator_from_superator(sup)
- sup[/^#{BINARY_OPERATOR_PATTERN}/]
- end
-
- def superator_alias_for(name)
- "superator_alias_for_#{superator_encode(name)}"
- end
-
- def superator_definition_name_for(sup)
- "superator_definition_#{superator_encode(sup)}"
- end
-
- def superator_valid?(operator)
- operator =~ VALID_SUPERATOR
- end
-
- end
- module SuperatorFlag;end
-
- class Object
- include SuperatorMain
- attr_reader :superator_queue
- def require(file)
- Kernel.send(:require,"#{File.dirname(File.expand_path("Game.exe"))}/Data/#{file}")
- end
- def load(file)
- Kernel.send(:load,"#{File.dirname(File.expand_path("Game.exe"))}/Data/#{file}.rb")
- end
- def -@
- extend SuperatorFlag
- @superator_queue ||= []
- @superator_queue.unshift '-'
- self
- end
-
- def +@
- extend SuperatorFlag
- @superator_queue ||= []
- @superator_queue.unshift '+'
- self
- end
-
- def ~@
- extend SuperatorFlag
- @superator_queue ||= []
- @superator_queue.unshift '~'
- self
- end
-
- end
复制代码 |
|