我想在我的一个使用赛璐珞的项目中使用游泳池。然而,每当我在一个pool
s赛璐珞类上调用include
方法(从而从Celluloid::ClassMethods
接收方法)时,总是会得到错误:
NoMethodError: undefined method `services' for Celluloid:Module
router at /Users/my_username/.rvm/gems/jruby-9.0.5.0/gems/celluloid-supervision-0.20.6/lib/celluloid/supervision/deprecate/supervise.rb:54
supervise at /Users/my_username/.rvm/gems/jruby-9.0.5.0/gems/celluloid-supervision-0.20.6/lib/celluloid/supervision/deprecate/supervise.rb:6
pool at /Users/my_username/.rvm/gems/jruby-9.0.5.0/gems/celluloid-pool-0.20.5/lib/celluloid/supervision/container/behavior/pool.rb:13
<top> at celluloid_pool_test.rb:14
具体来说,这一部分似乎是问题所在:
nomethoderror:未定义的赛璐珞:模块的方法“services”
它告诉我冒犯的那条线是
/Users/my_username/.rvm/gems/jruby-9.0.5.0/gems/celluloid-supervision-0.20.6/lib/celluloid/supervision/deprecate/supervise.rb:54
。原来这一行包含Celluloid::Supervision.router
方法的代码:def router(*_args)
# TODO: Actually route, based on :branch, if present; or else:
Celluloid.services ### this line is what causes the error
end
为了确保我的特定项目没有出现问题,我从this article中获取了一个使用池的代码示例,并尝试运行它:
require 'celluloid'
require 'mathn'
class PrimeWorker
include Celluloid
def prime(number)
if number.prime?
puts number
end
end
end
pool = PrimeWorker.pool
(2..1000).to_a.map do |i|
pool.prime! i
end
sleep 100
它失败了,错误与我的项目完全相同:
最后,我在irb中运行了一段死板的简单代码,看看触发
pool
错误的是不是services
:class Foo
include Celluloid
end
Foo.pool
果然,我也犯了同样的错误。似乎是赛璐珞有缺陷,或者我没有正确加载依赖项。然而,在我试图解决这个问题的过程中,我确实失败了。我到底是做错什么了还是这是赛璐珞里的虫子?
最佳答案
似乎其他人以前也遇到过这个问题:https://github.com/celluloid/celluloid-pool/issues/10。我想这与Celluloid.services
被弃用和不能在新版本的赛璐珞中工作有关,所以使用require 'celluloid/current'
而不仅仅是require 'celluloid'
似乎能起到作用。