Project1
标题: [送给那些懒得Alias的人的礼物] Monkeypatch v0.5 [打印本页]
作者: LBQ 时间: 2013-9-26 06:53
标题: [送给那些懒得Alias的人的礼物] Monkeypatch v0.5 本帖最后由 LBQ 于 2013-9-26 21:29 编辑
- Monkeypatch v0.5 - LBQ的尝试 -
这个脚本的用途就如同他的名字一样——用来打猴子补丁
当然在下这种渣估计写出来的这个东西估计也会bug多多吧。。。
用法:
class Scene_Base
alias lbq_sb_start start
def start
lbq_sb_start
puts "hi"
end
end
class Scene_Base
alias lbq_sb_start start
def start
lbq_sb_start
puts "hi"
end
end
等同于
class Scene_Base
monkeypatch :start do
puts "hi"
end
end
class Scene_Base
monkeypatch :start do
puts "hi"
end
end
默认在最后加入代码
如果想要在之前加入的话用 monkeypatch :name, :before
于是这个理论上可以替代alias猴子补丁但是因为渣LBQ对Proc之类的东西了解不多=。=所以出错了麻烦说一下。。
#===============================================================================
# Monkeypatch v 0.5 by LBQ
#===============================================================================
module Monkeypatch
$monkeypatch_blocks = { }
def monkeypatch( *args,&block)
pos = :none
if args.length == 0
raise
elsif args.length == 1
pos = :after
elsif args.length == 2
pos = args[ 1 ]
else
raise
end
method_name = args[ 0 ]
old_name = method_name.to_sym
new_name = "monkeypatch_#{self.inspect.downcase}_#{method_name.to_s}_lbq" .to_sym
alias_method new_name, old_name
monkeypathcblockname = self .inspect .downcase +"_" + method_name.to_s + rand ( 99999 ) .to_s
$monkeypatch_blocks [ monkeypathcblockname.to_sym ] = block
if pos == :after
class_eval %{
def #{method_name}(*args)
#{new_name.to_s}(*args)
instance_eval( &$monkeypatch_blocks[ :#{monkeypathcblockname}])
end
}
else
class_eval %{
def #{method_name}(*args)
instance_eval( &$monkeypatch_blocks[ :#{monkeypathcblockname}])
#{new_name.to_s}(*args)
end
}
end
end
end
#===============================================================================
# Monkeypatch v 0.5 by LBQ
#===============================================================================
module Monkeypatch
$monkeypatch_blocks = { }
def monkeypatch( *args,&block)
pos = :none
if args.length == 0
raise
elsif args.length == 1
pos = :after
elsif args.length == 2
pos = args[ 1 ]
else
raise
end
method_name = args[ 0 ]
old_name = method_name.to_sym
new_name = "monkeypatch_#{self.inspect.downcase}_#{method_name.to_s}_lbq" .to_sym
alias_method new_name, old_name
monkeypathcblockname = self .inspect .downcase +"_" + method_name.to_s + rand ( 99999 ) .to_s
$monkeypatch_blocks [ monkeypathcblockname.to_sym ] = block
if pos == :after
class_eval %{
def #{method_name}(*args)
#{new_name.to_s}(*args)
instance_eval( &$monkeypatch_blocks[ :#{monkeypathcblockname}])
end
}
else
class_eval %{
def #{method_name}(*args)
instance_eval( &$monkeypatch_blocks[ :#{monkeypathcblockname}])
#{new_name.to_s}(*args)
end
}
end
end
end
突然发现貌似忘了给最后的附加代码了。。。
class Module
include Mokeypatch
end
class Module
include Mokeypatch
end
作者: SuperMario 时间: 2013-9-26 08:14
如果我要在前后都加呢,或者要用原方法的返回值进行新运算呢?
作者: 熊喵酱 时间: 2013-9-26 08:25
Well... I have never seen anyone is that lazy........
Good script though.
作者: 喵呜喵5 时间: 2013-9-26 09:35
用SB一样的姿势开心的跑来来当小白鼠……
以后我这种人不是更懒得用Alias了嘛!
作者: 怪蜀黍 时间: 2013-9-27 09:46
+ rand(99999).to_s
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1