[email protected]:~$

  • Celluloid::Actor结构与调用过程

    ruby是面向对象语言,但是Celluloid做到了无需更换代码,仅在类中include Celluloid就可以进行面向Actor编程 class A include Celluloid def foo puts "bar" end end 此时A已经代表一个Actor类 a = A.new a.class #A a.class.ancestors #[A, Celluloid::InstanceMethods, Celluloid, Object, PP::ObjectMixin, Kernel, BasicObject] a.is_a? A #true A === a #true of course! a.is_a? Celluloid #true Celluloid === a #false W..T..F?? wtf? a是A的实例,我们的测试可以通过 但是当我们用Celluloid来测试时a.is_a?和Celluloid.===结果不一致 ###why? 因为a并不是A的实例 a.class #A...

  • Actor入门

    最近对Actor模式很有兴趣(Celluloid), 记下自己的心得和对Actor模式的理解。 要想知道一个东西有什么必要性,就要知道没有它的话是什么样子 如果没有struct… point1x = point1y = point2x = point2y = 0 如果没有class… def rectangle_area rect #something... end def circle_area circle #something... end #etc... 如果没有actor… #好吧,可能没有的话也没什么关系.. 当然还是有关系的.. 比如我们设计一个账户 class Account attr_accessor :money def take_money amount if amount < money new_amount = money - amount self.money = new_amount "ok!" else...

  • reel和eventmachine的粗略对比[更新2013年7月]

    四个月后的更新 因为水平不足,对Reel造成了极大的误解.. (希望不要误解到别人) 更正下之前的误解 Reel其实是异步IO单线程的,可以认为和EM一样,但是大家都知道Celluloid主打的就是并行编程 于是..如果你想要并行的话可以调用detach方法,并且自己管理socket 当然这样做的话就不是异步IO了(WTF……….) 另外reeltalk中的代码貌似也有一些问题.. 所以现在来说还是优先使用eventmachine, celluloid-io & reel目前还是有一些问题(当然celluloid已经比较成熟了, 可以大胆使用) 起因 本来是很追捧EM的,直到看到了一篇文章 感觉之前学过些erlang, 应该很容易理解celluloid. 而且最近工作中也需要用到websocket,果断选择reel来做(无条件听信大牛..) 一坑 看了下文档,结果从README的helloworld就被坑了, 粘贴后执行程序会直接退出,不会block住 源码 require 'reel' Reel::Server.supervise("0.0.0.0", 3000) do |connection| while request = connection.request case request when Reel::Request puts "Client requested: #{request.method} #{request.url}" request.respond :ok, "Hello, world!" when Reel::WebSocket puts "Client made...

  • ActiveSupport::Concern学习

    ##为什么需要使用ActiveSupport::Concern active_support/concern.rb中已解释的很清楚 简要的总结下 ———————— module Bar需要在included时调用module Foo的方法 此时需要在class C中include Bar就需要先include Foo 但是像这样使用的时候需要关心依赖问题是很不爽的,我们希望使用Bar则include Bar即可,不应该再去管Bar的依赖问题 module Bar include Foo #..... end 这样我们就可以只include Bar而不需要关心Foo 但这样也有问题,Foo可能在included中需要class C。但是现在这样Foo在included中取到的实际是Bar,并不是C ActiveSupport::Concern可以神奇的帮我们解决这个问题,保证Bar的执行没问题,并且使用者不需要关心Foo 只需把def self.included换成Concern提供的include方法即可 Concern源码 module Concern #被extend时会对extend其的module设置一个实例变量用于储存依赖数组 def self.extended(base) #:nodoc: base.instance_variable_set("@_dependencies", []) end #被include时会在include其的module中追加依赖self #如果include的对象中不包含@_dependencies(即没有extend Concern) #则表明该对象为正确的include目标,在该对象上include所有本module依赖的module,extend ClassMethods。最后调用'included'可以保证避免included中的依赖问题 def append_features(base) if base.instance_variable_defined?("@_dependencies") base.instance_variable_get("@_dependencies") << self return false...