module Concurrent::Concern::Dereferenceable

Object references in Ruby are mutable. This can lead to serious problems when the `#value` of a concurrent object is a mutable reference. Which is always the case unless the value is a `Fixnum`, `Symbol`, or similar “primitive” data type. Most classes in this library that expose a `#value` getter method do so using the `Dereferenceable` mixin module.

@!macro copy_options

Public Instance Methods

deref()
Alias for: value
value() click to toggle source

Return the value this object represents after applying the options specified by the `#set_deref_options` method.

@return [Object] the current value of the object

# File lib/concurrent-ruby/concurrent/concern/dereferenceable.rb, line 21
def value
  synchronize { apply_deref_options(@value) }
end
Also aliased as: deref

Protected Instance Methods

apply_deref_options(value) click to toggle source

@!visibility private

# File lib/concurrent-ruby/concurrent/concern/dereferenceable.rb, line 63
def apply_deref_options(value)
  return nil if value.nil?
  return value if @do_nothing_on_deref
  value = @copy_on_deref.call(value) if @copy_on_deref
  value = value.dup if @dup_on_deref
  value = value.freeze if @freeze_on_deref
  value
end
ns_set_deref_options(opts) click to toggle source

@!macro dereferenceable_set_deref_options @!visibility private

# File lib/concurrent-ruby/concurrent/concern/dereferenceable.rb, line 54
def ns_set_deref_options(opts)
  @dup_on_deref = opts[:dup_on_deref] || opts[:dup]
  @freeze_on_deref = opts[:freeze_on_deref] || opts[:freeze]
  @copy_on_deref = opts[:copy_on_deref] || opts[:copy]
  @do_nothing_on_deref = !(@dup_on_deref || @freeze_on_deref || @copy_on_deref)
  nil
end
set_deref_options(opts = {}) click to toggle source

@!macro dereferenceable_set_deref_options

Set the options which define the operations #value performs before
returning data to the caller (dereferencing).

@note Most classes that include this module will call `#set_deref_options`
  from within the constructor, thus allowing these options to be set at
  object creation.

@param [Hash] opts the options defining dereference behavior.
@option opts [String] :dup_on_deref (false) call `#dup` before returning the data
@option opts [String] :freeze_on_deref (false) call `#freeze` before returning the data
@option opts [String] :copy_on_deref (nil) call the given `Proc` passing
  the internal value and returning the value returned from the proc
# File lib/concurrent-ruby/concurrent/concern/dereferenceable.rb, line 48
def set_deref_options(opts = {})
  synchronize{ ns_set_deref_options(opts) }
end
value=(value) click to toggle source

Set the internal value of this object

@param [Object] value the new value

# File lib/concurrent-ruby/concurrent/concern/dereferenceable.rb, line 31
def value=(value)
  synchronize{ @value = value }
end