Class: Struct

Inherits:
Object
  • Object
show all
Includes:
KeyDial, KeyDial::Coercion::Structs
Defined in:
lib/key_dial.rb

Constant Summary

Constants included from KeyDial::Coercion::Structs

KeyDial::Coercion::Structs::EMPTY

Constants included from KeyDial

KeyDial::VERSION

Instance Method Summary collapse

Methods included from KeyDial::Coercion::Structs

create, included, #to_struct

Methods included from KeyDial

#call, #to_dial

Instance Method Details

#empty?Boolean

Structs are not empty by definition

Returns:

  • (Boolean)


119
# File 'lib/key_dial.rb', line 119

def empty?; false; end

#fetch(key_obj, default = (default_skipped = true; nil)) ⇒ Object

Extend Struct to give it a fetch method



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/key_dial.rb', line 94

def fetch(key_obj, default = (default_skipped = true; nil))
  if key?(key_obj)
    # Use key? method to check this struct has the requested key

    # key? method ensures that key_obj is valid inside struct[key] syntax

    return self[key_obj]
  else
    # Struct doesn't contain this key - proceed to defaults

    if block_given?
      # Warn if both block and default supplied

      warn 'warning: block supersedes default value argument' if !default_skipped
      # Return result of block as default

      return yield(key_obj)
    elsif !default_skipped
      return default
    else
      raise KeyError, "key not found: #{key_obj.to_s}"
    end
  end
end

#key?(key_obj) ⇒ Boolean

Extend Struct to give it a key? method

Returns:

  • (Boolean)


72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/key_dial.rb', line 72

def key?(key_obj)
  # These would be valid keys in struct[key] syntax

  if key_obj.is_a?(Symbol)
    key = key_obj
  elsif key_obj.is_a?(String)
    key = key_obj.to_sym
  elsif key_obj.is_a?(Numeric) && key_obj.respond_to?(:to_i)
    key = key_obj.to_i
  else
    return false #raise TypeError, "no implicit conversion of #{key_obj.class} into Symbol"

  end

  if key.is_a?(Symbol)
    # Does the struct have the identified key?

    return self.members.include?(key)
  elsif key.is_a?(Integer)
    # Does the struct have this numbered key?

    return key.magnitude + (key <= -1 ? 0 : 1) <= self.size
  end
end