Tag: 常数

使用Rails自动加载时,名称与顶级常量冲突

我在app/models/dog.rb有一个类Dog ,在app/services/my/deeply/nested/dog.rb另一个类Services::My::Deeply::Nested::Dog 。 现在在Services :: My(app / services / my.rb)中,我引用了以下内容之一(无需区分,因为在所有情况下行为都是相同的): Deeply::Nested::Dog Services::My::Deeply::Nested::Dog ::Services::My::Deeply::Nested::Dog 无论我选择哪一个,我总是收到以下错误消息: services / my.rb:warning:toplevel constant由Services::My::Deeply::Nested::Dog引用的Services::My::Deeply::Nested::Dog 此外,我深深嵌套的狗甚至从未被解释者看到(我通过使用put和语法错误发现,没有任何反应)。 可能的解决方法(我都不喜欢)是: 重命名其中一个Dog类 使用RAILS_ENV = production运行以禁用自动加载并使用预先加载 require_dependency指向深层嵌套的狗 作为一名计算机科学家,我发现上述解决方法都不令人满意。 我想了解为什么没有解决方法就找不到我深深嵌套的Dog,并找出最先进的Ruby / Rails解决方案对于这个问题。 非常感谢提前。

启动Sidekiq队列时的循环依赖关系

加载sidekiq队列时出现以下错误: RuntimeError: Circular dependency detected while autoloading constant FileProcessor /Users/johnmcauley/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:492:in `load_missing_constant’ /Users/johnmcauley/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:184:in `const_missing’ /Users/johnmcauley/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:526:in `load_missing_constant’ /Users/johnmcauley/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:184:in `const_missing’ /Users/johnmcauley/workspace/wripl-capture/lib/wripl_article.rb:23:in `build_from_crawled_page’ /Users/johnmcauley/workspace/wripl-capture/app/workers/article_worker.rb:7:in `perform’ /Users/johnmcauley/.rvm/gems/ruby-2.2.2/gems/sidekiq-3.4.1/lib/sidekiq/processor.rb:75:in `execute_job’ /Users/johnmcauley/.rvm/gems/ruby-2.2.2/gems/sidekiq-3.4.1/lib/sidekiq/processor.rb:52:in `block (2 levels) in process’ /Users/johnmcauley/.rvm/gems/ruby-2.2.2/gems/sidekiq-3.4.1/lib/sidekiq/middleware/chain.rb:127:in `block in invoke’ /Users/johnmcauley/.rvm/gems/ruby-2.2.2/gems/sidekiq-3.4.1/lib/sidekiq/middleware/server/active_record.rb:6:in `call’ /Users/johnmcauley/.rvm/gems/ruby-2.2.2/gems/sidekiq-3.4.1/lib/sidekiq/middleware/chain.rb:129:in `block in invoke’ /Users/johnmcauley/.rvm/gems/ruby-2.2.2/gems/sidekiq-3.4.1/lib/sidekiq/middleware/server/retry_jobs.rb:74:in `call’ /Users/johnmcauley/.rvm/gems/ruby-2.2.2/gems/sidekiq-3.4.1/lib/sidekiq/middleware/chain.rb:129:in `block in invoke’ /Users/johnmcauley/.rvm/gems/ruby-2.2.2/gems/sidekiq-failures-0.4.4/lib/sidekiq/failures/middleware.rb:9:in `call’ /Users/johnmcauley/.rvm/gems/ruby-2.2.2/gems/sidekiq-3.4.1/lib/sidekiq/middleware/chain.rb:129:in `block in invoke’ /Users/johnmcauley/.rvm/gems/ruby-2.2.2/gems/sidekiq-3.4.1/lib/sidekiq/middleware/server/logging.rb:15:in `block in call’ […]

为什么不能用Ruby声明方法中的常量?

考虑以下情况,StubFoo是Foo的存根,我希望将其用于某些测试。 class Runner def run Foo = StubFoo foo = Foo.new # using Foo… end end 这会生成以下错误消息: Dynamic constant assignment 然而,在RSpec我可以做以下工作,这是有效的,并且是完全合法的: it “should be an example” do Foo = StubFoo foo = Foo.new foo.to_s.should == “I am stubbed!” end 关于这一点的一些问题。 为什么这适用于RSpec测试用例,而不是上述方法? 据我所知,“它”只是RSpec中的一种方法,但我能够在“方法”中重新声明一个常量。 我在使用模拟框架之前做这个,纯粹想要知道如何在Ruby中进行模拟,存根等等。 我听说动态语言更容易模拟/存根,互联网上有指南,其中简单的类重新分配如上所述。 根据我的研究,在Ruby中,不可能在方法中声明常量,但我如上所述会感到困惑。 编辑 对,这开始变得更有意义了。 我已经更新了run,现在正在使用const_set。 def run old = Foo self.class.const_set(:Foo, StubFoo) […]

Ruby:const_set在块之外?

我想用Ruby模拟一个类 。 如何编写一个处理样板代码的方法? 以下代码: module Mailgun end module Acani def self.mock_mailgun(mock) temp = Mailgun const_set(:Mailgun, mock) p Mailgun yield ensure const_set(:Mailgun, temp) end end Acani.mock_mailgun(‘mock’) { p Mailgun } 打印: “mock” Mailgun 这里发生了什么? 为什么Mailgun在块内部具有原始值? 这与Ruby绑定有关吗? Ruby版本:2.1.1p76

Module.private_constant做什么? 有没有办法只列出私有常量?

从Ruby 1.9.3开始,我们可以创建私有常量: module M class C; end private_constant :C end 关于它的作用是否有良好的文档? 有没有办法获得类似于调用constants私有常量的名称

让父类的方法访问子类的常量

例如: class Animal def make_noise print NOISE end end class Dog < Animal NOISE = "bark" end d = Dog.new d.make_noise # I want this to print "bark" 我如何完成上述工作? 目前它说 uninitialized constant Animal::NOISE

访问常量

为什么我不能从’A’访问以下’B’但可以从主环境访问? module A; end A.instance_eval{B=1} B #=> 1 A::B #=> uninitialized

Ruby常量是什么意思?

Ruby常量究竟意味着什么? 以下代码未显示任何“常量”属性。 警告就在那里,但我仍然要改变A指的是什么。 A = 1 puts A # => 1 A = 2 # warning: already initialized constant A puts A # => 2 或者Ruby常量只是一个没有任何执行的指示?