Skip Undefined
The initializer uses special constant Dry::Initializer::UNDEFINED
to distinguish variables that are set to nil
from those that are not set at all.
When no value was provided, the constant is assigned to a variable, but hidden in a reader.
require 'dry-initializer'
class User
extend Dry::Initializer
option :email, optional: true
end
user = User.new
user.email
# => nil
user.instance_variable_get :@email
# => Dry::Initializer::UNDEFINED
This gives you full control of the real state of the attributes. However, all that checks cost about >30% of instantiation time, and make attribute readers 2 times slower.
To avoid the overhead in cases you don't care about the differences between nil
and undefined, you can use a light version of the module. Add [undefined: false]
config to either extend
or include
line of code:
extend Dry::Initializer[undefined: false]
include Dry::Initializer[undefined: false].define -> do
# ...
end
This time you should expect nil
every time no value was given to an optional attribute:
require 'dry-initializer'
class User
extend Dry::Initializer[undefined: false]
option :email, optional: true
end
user = User.new
user.email
# => nil
user.instance_variable_get :@email
# => nil