注册会员 登录
Project1 返回首页

zhangbanxian的个人空间 https://rpg.blue/?79298 [收藏] [复制] [分享] [RSS]

日志

半仙的ruby研究之旅(一) 关于一种新的编程思想——原型编程 ...

已有 361 次阅读2012-12-25 22:34 |个人分类:ruby研究

你一定已经知道,ruby是面向对象的程序语言,但你可能不知道ruby其实支持原型编程。
其实,你可能已经在许多地方看到过这种编程思想,甚至是在rm的默认脚本中。


module Cache
#--------------------------------------------------------------------------
# ● 获取动画图像
#--------------------------------------------------------------------------
def self.animation(filename, hue)
load_bitmap("Graphics/Animations/", filename, hue)
end
end

想起来了吗?没错这就是rm脚本里典型的一部分(xp的是定义在里默认库中,可以看f1帮助),当我们定义一个模块方法时,就很自然地写下了def self.xxx,但你有没有想过为什么可以这么写,如果我们把这套路用到一个不是模块的对象,没错就是一个Object类生成的普通对象时,情况会怎样?我们来试试看...
 
fucker = Object.new
def fucker.says
print "mother fucker"
end
fucker.says
 
怎么样屏幕上打出了mother fucker,没错,其实我们如果只是需要一个namespace时也完全可以不使用模块,而只是一个Object对象...
还有一个更有趣的用法,那就是所谓的原型编程了(玩过js的可能很熟悉,没错就是那货,在ruby里也是可以完美实现的),继续之前的话题...
 
gentleman = fucker.clone
#绅士虽然也会说mother fucker,但平时不说,很讲礼貌
def gentleman.greet #写法1
print "greeting"
end
dog = gentleman.clone
class << dog #写法2
#狗可不会说话xd
undef says
def greet
print "bite"
end
end
#什么?我们忘了给fucker定义一个greet了?没关系,加上就好了- -b
fucker.define_singleton_method (:greet){says}#写法3,ruby1.9特有(rmva)
#ok,大功告成,看看运行结果吧...
fucker.greet #=>mother fucker
fucker.says #=>mother fucker
gentleman.greet #=>greeting
gentleman.says #=>mother fucker (表里不一的家伙xd
dog.greet #=>bite
dog.says #=>undefined method erro(我不会说话啊,嗷呜
 
如是,就可以衍生出许多的写法,其实从某种意义上讲,这种写法更符合动态语言的思想,没错,我什么时候需要就什么时候给它安个方法,就像组装零件一样;而每一个对象也都充当了类的角色...基于类的oo编程,就是你在一开始就想好所有产品的图纸,然后按照一种既定的方式进行生产;而基于原型的oo编程,则是你先设计好一样产品的图纸,然后一边批量生产老产品一边思考我有哪些需求,然后新产品就是根据原产品进行改造后投入生产...当然两种方法也都是有利有弊的,每个产品都有一个相应的图纸,同类的产品优化和改进自然就更容易进行(代码可读性方面原型编程确实显得弱势很多,如果你忘了dog是否定义了says方法,你就得上去找gentleman再找fucker,多级继承时就会感到亚历山大);但有时顾客仅仅是需要将产品装到一个更结实的塑料袋里,我们也去给它画一个图纸,是否就有点小题大作呢?
很庆幸的是ruby是一个完全自由的语言,既可以进行基于类的编程,也可以进行基于原型的编程,这一切都由你,期间的优劣性就在实践中慢慢体会吧...

最后以一个rmxp的老问题,结束今天的话题吧...va提供了scene_manager可以自由地切换场景,和返回上一场景,插屁时可没考虑到这个需求,这时我们要切换个装备场景,退出时却发现我们回到了菜单场景,肿么办,去改class末?no,no,你只需在事件框内插入如下脚本...
 
$scene = Scene_Equip.new
class << $scene
alias fucker_update_right update_right
def update_right
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
else
fucker_update_right
end
end
end
 
其实,rm默认脚本里只用到一次的各种window类亦是数不胜数,尝试着把它们改成原型编程的写法吧,今天的话题就到此为止...

鸡蛋

鲜花

评论 (0 个评论)

facelist doodle 涂鸦笔

您需要登录后才可以评论 登录 | 注册会员

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-3 00:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部