qiezi的学习园地

AS/C/C++/D/Java/JS/Python/Ruby

  C++博客 :: 首页 :: 新随笔 ::  ::  :: 管理 ::
工作忙,学习也忙。

1、Ruby on Rails

前阵子看了一下Ruby on Rails,不禁为其深深折服,为Ruby,也为Rails。

照着Four Days on Rails做了一遍,虽然对Ruby不甚熟悉,不过一路下来感觉非常轻松,在搞明白:xxx和"xxx"是同一个意思以后,终于能看懂大部分代码了,也为这种语法叫好,要知道很多时候引号并不好用,当出现嵌套的时候。(注:在Ruby里,"hello, #{user[:name]}"表示把user["name"]的值放到那个引号里面,这样做可以不仔细去考虑是不是使用单引号)

接着试了一下typo,一个ruby写的blog程序,看到它具有登录功能,而在4 days中并没有看到,于是找了相关资料,原来Rails中已经有这东西了,简单查看了文档以后,就为4 days中的那个演示项目加上了登录功能,前后不过十来分钟。

这样看来,一个人要做一个blog程序,大概2-3小时就够了,包括编写数据库模式、生成管理者使用的MVC结构(具有添加修改删除等功能)、添加登录功能,在此基础上再生成一个Controller,简单修改就能改成供其它用户使用的阅读界面,再稍费点神就能加上评论功能了。当然离标准的blog程序还有段距离,比如还不支持RSS,不过自己用来写点东西记点笔记什么的,足够用了。

2、Ajax on Rails

接着学习了Ajax on Rails,非常好用的东东,文档并不是很多,简单看了一下,觉得离我的想法还有点距离。我希望是可以实现像Gmail一样,读取一些变量过来,在页面上动态生成元素,而不是读取其它页面并把其中的元素替换掉当前页面上的元素,或者是添加到当前页面上这么简单。我查看过Gmail界面的源代码,好像是使用过混淆器,不过还是可以看出来,它是从服务端读取一些变量,读到客户端再把它转成可视的元素。

微软的space.msn.com在注册时,有一个验证码,当你看不清时可以点击右边的按钮再换一个验证码,这时只会刷新验证码而不用刷新整个页面,这种东西使用Ajax on Rails应该很轻松就可以完成。不过我还不知道在Rails中如何生成验证码呢,应该是使用其它的库来生成吧,有空查一下看看。

3、Ruby and Rails

Ruby的语法对于我这样的初学者(实际上并未正式学习)来说,有些地方理解起来还真有点难,不过它的代码看起来却很舒服,简洁美观,似乎很多语法都是为了美观,当然满篇的end除外。

Rails同样给我简洁美观的印象,使用简单,没有什么废话,视图如果不修改的话,甚至可以不生成出来。

不知道效率如何,不过听说Ruby比Python运行效率要高,豆瓣使用Python能做出来,我想使用Ruby应该也可以做出能够接受的东西。

有空要好好学一下Ruby,为了Rails。

4、asgard

最近实在是太忙了,asgard项目起了个头又懒得动了,许多情况下使用C++都意味着要写很多代码,目前完成了异步回调函数的泛类型匹配,在编写调用函数的适配器时,虽然已经想出了解法,只是要写大量的模板,天天在模板堆里头都是痛的,只好先放一放了。


注:
1、上面提到的“异步回调函数的泛类型匹配”,指的是下面的做法:
void callback (int, short, const char*);
Method <string(in<char>, in<char>)> method;
method.async_call ('a', 'b', callback);
由于char可以转型到int, short,而out<string>可以转型到const char*,所以让它支持这种“泛”类型匹配也是理所当然的了,这个东西已经完成了。

2、“调用函数的适配器”是更复杂的一个东西,用在服务器端:
Method <void(inout<Buffer<char> >, in<string>)> my_strcat;
my_strcat.setMethod (Adapter <void(Default<1>, Default<2>, ContainerSize<1>)> (strncat) );

这是最终简化了的形式,比上次所说的简单了不少,因为很多东西是可以推导出来的,这也是测试证明可以实现的,一个简单的修改就是把Adapter从类改为一个函数,由于模板函数的参数类型可以推导出来,所以省去了strncat函数类型的描述。

实际上是把char* strncat(char*, const char*, size_t)匹配给上面这个method,Adapter承担解释角色。

它的函数类型的模板参数中,void可以推导为out<void>,strcat的调用结果赋给out<void>,可以不理会,实际上是使用偏特化来忽略它的,因为我的vector <IParameter*>中根本不包括out<void>这个对象。

后面的Default<1>表示使用默认的转换器,即直接把Buffer<char>对象转成char*类型,由于Buffer<T>中实现了operator T*,这个转换不成问题,下一个是Default<2>,在in<string>中也实现了operator const char*,所以这个转换也很顺利,再下一个是ContainerSize<1>表示从Buffer<char>对象中取容器的大小,这也是个模板。

目前一共实现了3个模板,Default<int>默认转换,Size<int>取sizeof,ContainerSize取容器大小。

写模板既有挑战,又有困难,有时甚至有放弃的想法,甚至有朋友笑话说,人家都动态语言了,你还在使用这种宏一样的语言。我也只好一笑置之,这样的功能在动态语言里多么容易呀,的确在做一种不不明智的事。。。
posted on 2005-10-08 23:15 qiezi 阅读(398) 评论(1)  编辑 收藏 引用 所属分类: 学习方向