Advanced Rails -- Ruby 基本技术(7) -- 元编程技巧2

请先参阅
http://www-128.ibm.com/developerworks/cn/opensource/os-lightweight9/
http://www.iteye.com/post/168845

翻译的晦涩难懂,多多关照
=============================================================

延续(Continuations )

延续(Continuations )是一个很强大的流程控制机制。一个延续(Continuation)表现为一个特定的调用栈和词

法变量状态。他是在执行Ruby代码一个点上的快照。不幸的是,Ruby1.8对延续(Continuations )的实现非常的

慢,造成了对很多应用不可用。Ruby 1.9 的虚拟机可能会改进这个情况,但是不要期望在Ruby1.8上得到延续

(Continuations )的比较好的性能。但是,这个是很有用的组成部分,并且基于延续(continuation-based)的

web框架提供了一个在像Rails框架很有趣的选择。


延续(Continuations)强大的几个原因:

延续(Continuations)仅仅是一个对象;可以在函数间传递。

延续(Continuations)可以在任何地方调用。如果有一个延续(Continuations)的引用,就可以调用。

延续(Continuations)可以再参与。可以用延续(Continuations)在一个函数里返回多次。

延续(Continuations)通常被认为“structured GOTO”。本身,它被作为在同一个情况下任何GOTO construct。延

续(Continuations)非常的少或者不会在一个应用内部代码;它通常应该被封装在库里面。 I don't say this

because I think developers should be protected from themselves. 或者,相比直接使用延续

(continuations), 把他们提取出来更容易理解。这种思想就是程序员在构建软件应用时应该考虑到"external

iterator"或者 "coroutine" (both abstractions built on top of continuations) 而不是延续

("continuation")。

Seaside是Smalltalk的一个基于Continuations的web应用框架。Continuations在Seaside里用作管理会话(色素

sion)状态。每一个用户会话相当于一个服务器段的Continuation。当请求进入时,Continuation会被调用、更多

的代码被执行。这个结果让整个事务可以作为一个代码流,即使他跨过多个HTTP请求。这个能力来自于Smalltalk

的延续是连续的事实;他可以在一个数据库或者文件系统编码,然后溶解并根据请求调用。Ruby的延续不是顺序

的。在Ruby里,延续是只在内存里并且不能转变成字节流。

Borge是一个简单Seaside 2到Ruby移植。Seaside和Borges的主要区别是Borges必须存储当前的延续在内存里,因为他们不是连续的。这是一个很大的限制,他阻止了Borges在任何程度上成为一个很好的web应用。如果连续的延续在Ruby实现,即不会有这个限制了。

在下面Borges很明显的指出了延续的强大,这个例子提供一个在线商店的物品列表:

        class SushiNet::StoreItemList < Borges::Component

	  def choose(item)
	    call SushiNet::StoreItemView.new(item)
	  end

	  def initialize(items)
	    @batcher = Borges::BatchedList.new items, 8
	  end 

	  def render_content_on(r)
	    r.list_do @batcher.batch do |item|
	      r.anchor item.title do choose item end
	    end

	    r.render @batcher
          end

       end # class SushiNet::StoreItemList


大部分的功能出现在render_content_on里,它用了一个BatchedList去提供分页的连接到产品的列表。但是有趣的是在调用anchor,一个储存了对choose的调用,在相应的连接被点击的时候才执行了。

当然,在web编程的延续上还是有很多分歧。HTTP在设计的时候就是无状态的协议,对于web事务的延续恰好是相反的。所有的延续必须储存在服务器上,这将占用额外的内存和硬盘空间。因此必须处理会话,把用户的流量定向到同一个服务器。结果就是,如果一个server当机,他的所有的session就丢失了。比较流行的Seaside的应用——DabbleDB,很少使用了延续。

你可能感兴趣的:(编程,Web,应用服务器,Ruby,Rails)