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
Source
# File lib/concurrent-ruby/concurrent/concern/dereferenceable.rb, line 21 def value synchronize { apply_deref_options(@value) } end
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
Also aliased as: deref
Protected Instance Methods
Source
# 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
@!visibility private
Source
# 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
@!macro dereferenceable_set_deref_options @!visibility private
Source
# File lib/concurrent-ruby/concurrent/concern/dereferenceable.rb, line 48 def set_deref_options(opts = {}) synchronize{ ns_set_deref_options(opts) } end
@!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
Source
# File lib/concurrent-ruby/concurrent/concern/dereferenceable.rb, line 31 def value=(value) synchronize{ @value = value } end
Set
the internal value of this object
@param [Object] value the new value