Project1

标题: 让"Loli"++"Shota"=>"Married" 合法 [打印本页]

作者: x387804363    时间: 2009-10-4 18:45
标题: 让"Loli"++"Shota"=>"Married" 合法
本帖最后由 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/
完整代码:
  1. #==============================================================================
  2. #Superators --- 添加自定义运算符的脚本 & "增强"require,load
  3. #Superators作者:Jay Phillips    版本:0.9.1 for Ruby
  4. #整理:光的圆周率
  5. #Superators 说明:
  6. #用途:在相应的物件类(Object)中添加自己需要的运算符.
  7. #
  8. #格式为:
  9. #class XXX
  10. #  superator "++" do |operand|   
  11. #    .....
  12. #  end
  13. #end  
  14. #
  15. #使用方法:
  16. #XXX处为物件类(Object)的名称,比如Array或String
  17. #....处为你所需要的功能的实现代码,operand代表运算符后面的参数,
  18. #self代表运算符前面的参数
  19. #
  20. #比如要实现p "1" ++ "2" #=>"12",对应的代码为:
  21. #
  22. #class String   
  23. #  superator "++" do |operand|   
  24. #   self + operand
  25. #  end
  26. #end  
  27. #
  28. #self + operand等效于:return self + operand
  29. #
  30. #※提示:
  31. #1.不可以重载或重写已存在的运算符,比如  + - * / &
  32. #您可以在网络上搜寻已存在的可重写运算符的重写方法,至于有哪些不可以重写,您可以
  33. #自己试试,脚本会告诉你,此问题可能在今后的版本中得到解决.
  34. #
  35. #2.类似于 ++1 ++"a" 1++2 之类的运算符不能够实现.
  36. #
  37. #3.本脚本在RPG Maker VX 1.02 及 RPG Maker XP 1.03环境下测试通过
  38. #
  39. #4.可以直接使用相对路径来调用require,load,使用方法和Ruby相同,加密后会出错
  40. #==============================================================================
  41. module SuperatorMain
  42.   
  43.   BINARY_RUBY_OPERATORS = %w"** * / % + - << >> & | ^ <=> >= <= < > === == =~"
  44.   UNARY_RUBY_OPERATORS  = %w"-@ ~@ +@"
  45.   
  46.   BINARY_OPERATOR_PATTERN = BINARY_RUBY_OPERATORS.map { |x| Regexp.escape(x) }.join "|"
  47.   UNARY_OPERATOR_PATTERN  =  UNARY_RUBY_OPERATORS.map { |x| Regexp.escape(x) }.join "|"
  48.   UNARY_OPERATOR_PATTERN_WITHOUT_AT_SIGN = UNARY_OPERATOR_PATTERN.map { |x| x.gsub('@', '') }
  49.   
  50.   VALID_SUPERATOR = /^(#{BINARY_OPERATOR_PATTERN})(#{UNARY_OPERATOR_PATTERN_WITHOUT_AT_SIGN})+$/
  51.   MAJOR,MINOR,TINY = 0,9,1
  52.   VERSION = [MAJOR,MINOR,TINY].join '.'
  53.   def superator_send(sup, operand)
  54.     if respond_to_superator? sup
  55.       __send__ superator_definition_name_for(sup), operand
  56.     else
  57.       raise NoMethodError, "Superator #{sup} 尚未在#{self.class}中定义"
  58.     end
  59.   end
  60.   
  61.   def respond_to_superator?(sup)
  62.     respond_to? superator_definition_name_for(sup)
  63.   end
  64.   
  65.   def defined_superators
  66.     methods.grep(/superator_definition_/).map { |m| superator_decode(m) }
  67.   end
  68.   
  69.   protected
  70.   
  71.   def superator(operator, &block)
  72.     raise ArgumentError, "没有提供块" unless block_given?
  73.     raise ArgumentError, "无效的运算符号!" unless superator_valid?(operator)
  74.    
  75.     real_operator = real_operator_from_superator operator
  76.    
  77.     class_eval do
  78.       # 再老运算符前执行.
  79.       alias_for_real_method = superator_alias_for real_operator
  80.       
  81.       if instance_methods.include?(real_operator) && !respond_to_superator?(operator)
  82.         alias_method alias_for_real_method, real_operator
  83.       end
  84.       
  85.       define_method superator_definition_name_for(operator), &block
  86.       
  87.       # 我们到方法定义的时候, 我们需要知道是否superator运算符有别名或有新的定义
  88.       #
  89.       define_method(real_operator) do |operand|
  90.         if operand.kind_of?(SuperatorFlag) && operand.superator_queue.any?
  91.           sup = operand.superator_queue.unshift(real_operator).join
  92.           operand.superator_queue.clear
  93.          
  94.           superator_send(sup, operand)
  95.         else
  96.           # 如果方法已定义
  97.           if respond_to? alias_for_real_method
  98.             __send__(alias_for_real_method, operand)
  99.           else
  100.             raise NoMethodError, "没有在 #{operand.inspect}:#{operand.class}找到方法:#{real_operator} "
  101.           end
  102.         end
  103.       end
  104.       
  105.     end
  106.    
  107.     def undef_superator(sup)
  108.       if respond_to_superator?(sup)
  109.         real_operator = real_operator_from_superator sup
  110.         real_operator_alias = superator_alias_for sup
  111.         
  112.         (class << self; self; end).instance_eval do
  113.           undef_method superator_definition_name_for(sup)
  114.           if respond_to? real_operator_alias
  115.             alias_method real_operator, real_operator_alias if defined_superators.empty?
  116.           else
  117.             undef_method real_operator
  118.           end
  119.         end
  120.       else
  121.         raise NoMethodError, "没有在 #{self.inspect}:#{self.class}中找到 superator #{sup} "
  122.       end
  123.     end
  124.   end
  125.   
  126.   private
  127.   
  128.   def superator_encode(str)
  129.     tokenizer = /#{BINARY_OPERATOR_PATTERN}|#{UNARY_OPERATOR_PATTERN_WITHOUT_AT_SIGN}/
  130.     str.scan(tokenizer).map { |op| op.split('').map { |s| s[0] }.join "_" }.join "__"
  131.   end
  132.   
  133.   def superator_decode(str)
  134.     tokens = str.match /^(superator_(definition|alias_for))?((_?\d{2,3})+)((__\d{2,3})+)$/
  135.     #输出 *tokens
  136.     if tokens
  137.       (tokens[3].split("_" ) + tokens[5].split('__')).reject { |x| x.empty? }.map { |s| s.to_i.chr }.join
  138.     end
  139.   end
  140.   
  141.   def real_operator_from_superator(sup)
  142.     sup[/^#{BINARY_OPERATOR_PATTERN}/]
  143.   end
  144.   
  145.   def superator_alias_for(name)
  146.     "superator_alias_for_#{superator_encode(name)}"
  147.   end
  148.   
  149.   def superator_definition_name_for(sup)
  150.     "superator_definition_#{superator_encode(sup)}"
  151.   end
  152.   
  153.   def superator_valid?(operator)
  154.     operator =~ VALID_SUPERATOR
  155.   end
  156.   
  157. end

  158. module SuperatorFlag;end
  159.   
  160.   class Object
  161.   include SuperatorMain
  162.   attr_reader :superator_queue
  163.   def require(file)
  164.    Kernel.send(:require,"#{File.dirname(File.expand_path("Game.exe"))}/Data/#{file}")
  165.   end
  166.   def load(file)
  167.    Kernel.send(:load,"#{File.dirname(File.expand_path("Game.exe"))}/Data/#{file}.rb")
  168.   end
  169.   def -@
  170.     extend SuperatorFlag
  171.     @superator_queue ||= []
  172.     @superator_queue.unshift '-'
  173.     self
  174.   end
  175.   
  176.   def +@
  177.     extend SuperatorFlag
  178.     @superator_queue ||= []
  179.     @superator_queue.unshift '+'
  180.     self
  181.   end
  182.   
  183.   def ~@
  184.     extend SuperatorFlag
  185.     @superator_queue ||= []
  186.     @superator_queue.unshift '~'
  187.     self
  188.   end
  189.   
  190. end
复制代码

作者: 凌辰    时间: 2009-10-4 20:37
我是来消灭0回复顺便鼓励的- -b
作者: x387804363    时间: 2009-10-4 21:52
Thanks...这种帖子能消除零回复我已经很高兴了= =a
作者: DeathKing    时间: 2009-10-6 11:47
我是被标题吸引进来的/lh
作者: x387804363    时间: 2009-10-6 20:51
欢迎欢迎 = = a
作者: 神思    时间: 2009-10-11 18:15
本帖最后由 神思 于 2009-10-11 18:16 编辑

呵呵学到了样东西``原来还可以前置运算符..


其实他是这样的

a ++ b
拆开来就是
a+(+b)
-__________-||||
作者: 神思    时间: 2009-10-11 18:16
本帖最后由 神思 于 2009-10-11 18:30 编辑

请斑竹消灭本帖-______________-||||
重0.............了




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