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

included

Methods included from KeyDial::Coercion::Coercer

#to

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