undefining constants on class autoload?

29 views
Skip to first unread message

Gary Weaver

unread,
Dec 7, 2012, 5:00:40 PM12/7/12
to rubyonra...@googlegroups.com
This probably sounds crazy but has it even been considered to either have a way to register constants for an autoloaded class so they will be undefined before reload, or maybe even just a class method to do:

def_const(:SOME_CONSTANT, value)

that would:

def def_const(constant, value)
  remove_const(constant) if const_defined?(constant)
  constant = value
end

Some say to put constants where they aren't autoloaded (like in initializers) and other even suggest using methods, but that defeats the purpose of using constants. So does the method above, but it is more in line with what Rails autoloading promises.

Seems like avoiding the problem makes some consider just using magic numbers in code which is like stepping back into time.

Steve Klabnik

unread,
Dec 7, 2012, 5:03:40 PM12/7/12
to rubyonra...@googlegroups.com
The problem with this system is that it's not normal Ruby, and if
someone doesn't use it, and uses Ruby, it all breaks.

Michael Koziarski

unread,
Dec 7, 2012, 5:04:13 PM12/7/12
to rubyonra...@googlegroups.com
If they're constants, that belong to the class, then make them constants inside the class:

class MyModel < ActiveRecord::Model
  SOME_CONSTANT = 42
end

That will reload correctly. 

 

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group.
To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-core/-/Rz8JI59_fV0J.
To post to this group, send email to rubyonra...@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-co...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.

Gary Weaver

unread,
Dec 7, 2012, 5:13:51 PM12/7/12
to rubyonra...@googlegroups.com
$ irb
1.9.3p194 :001 > class Class
1.9.3p194 :002?>      def def_const(constant, value)
1.9.3p194 :003?>          remove_const(constant) if const_defined?(constant)
1.9.3p194 :004?>          const_set(constant, value)
1.9.3p194 :005?>        end
1.9.3p194 :006?>   end
 => nil
1.9.3p194 :007 > class Something
1.9.3p194 :008?>   def_const(:HI, 1)
1.9.3p194 :009?>   end
 => 1
1.9.3p194 :010 > class Something
1.9.3p194 :011?>   def_const(:HI, 1)
1.9.3p194 :012?>   end
 => 1
1.9.3p194 :013 > Something::HI
 => 1

Like that.

Gary Weaver

unread,
Dec 7, 2012, 5:45:04 PM12/7/12
to rubyonra...@googlegroups.com
This is one of the things that got me concerned: http://devblog.avdi.org/2011/08/18/do-we-need-constants/

It's neat, but seems wrong (no offense to those using that technique).
Reply all
Reply to author
Forward
0 new messages