solutions to the annoying “warning: already initialized constant” message

前端 未结 3 1807
抹茶落季
抹茶落季 2021-01-30 08:23

Today I\'ve stumbled upon a tricky issue with Ruby constants. In our team someone created a module, which is included into multiple models. In our (spec) test output this result

相关标签:
3条回答
  • 2021-01-30 08:40

    I encountered this same problem today and found a simple solution.

    Since the warning is from trying to reassign a constant with its same value, I just changed

    module LifeCycle
      RESET = 'reset'
    end
    

    to

    module LifeCycle
      RESET ||= 'reset'
    end
    

    This took care of the warning and is a lot simpler than checking if each constant is defined. Let me know if you find a better solution.

    0 讨论(0)
  • 2021-01-30 08:52

    This is only a problem in applications that explicitly reload, like Rails applications.

    If the verbosity offends you, you can use unless as a statement modifier instead:

    module LifeCycle
      RESET = 'reset' unless const_defined?(:RESET)
    end
    

    This leaves a few weak arguments against Avdi's suggestion to only use methods:

    • constant lookup is faster than method lookup,
    • constant values are defined on load, not on (first) request,
    • constants visually suggest that they require no work to derive, and

    If you like Avdi's suggestion enough to ignore these, go with it.

    0 讨论(0)
  • 2021-01-30 09:03

    RESET is not a constant if it keeps changing in your code. If you rename it to lower case 'reset', the problem disappears. Ruby thinks Upper case variables are constants and thus displays an error to warn you that a constant has changed.

    0 讨论(0)
提交回复
热议问题