Skip to content

Instantly share code, notes, and snippets.

@serradura
Created December 16, 2021 23:49
Show Gist options
  • Save serradura/142014cda91dbafaefd2d63f015ef6e9 to your computer and use it in GitHub Desktop.
Save serradura/142014cda91dbafaefd2d63f015ef6e9 to your computer and use it in GitHub Desktop.
Examples of how to avoid the primitive obsession in Ruby.
rgb = [5, 55, 255]
def rgb_to_hex(r, g, b)
'#%02x%02x%02x' % [r, g, b]
end
p rgb # [5, 55, 255]
p rgb_to_hex(*rgb) # "#0537ff"
class RGBColor
Number = ->(value) do
return value if value.is_a?(Integer) && value.between?(0, 255)
raise ArgumentError, "given #{value.inspect}, but was expected an integer between 0 and 255"
end
attr_reader :red, :green, :blue
def initialize(r, g, b)
@red, @green, @blue = Number[r], Number[g], Number[b]
end
def to_a
[red, green, blue]
end
def to_hex
'#%02x%02x%02x' % to_a
end
end
rgb_color = RGBColor.new(5, 35, 255)
p rgb_color.to_a # [5, 35, 255]
p rgb_color.to_hex # "#0523ff"
RGBColor.new('a', 1, 255) # ArgumentError: given "a", but was expected an integer between 0 and 255
RGBColor = Struct.new(:red, :green, :blue) do
Number = ->(value) do
return value if value.is_a?(Integer) && value.between?(0, 255)
raise ArgumentError, "given #{value.inspect}, but was expected an integer between 0 and 255"
end
def initialize(r, g, b)
super(Number[r], Number[g], Number[b])
end
def to_hex
'#%02x%02x%02x' % to_a
end
end
rgb_color = RGBColor.new(5, 35, 255)
p rgb_color.to_a # [5, 35, 255]
p rgb_color.to_hex # "#0523ff"
RGBColor.new('a', 1, 255) # ArgumentError: given "a", but was expected an integer between 0 and 255
# --
# Struct's extra capabilities (provided by default):
rgb_color.to_h # {:red=>5, :green=>35, :blue=>255}
rgb_color[:red] # 5
rgb_color['red'] # 5
{
rgbs_colors: [
RGBColor.new(1, 1, 255),
RGBColor.new(5, 35, 255)
]
}.dig(:rgbs_colors, 1, :green) # 35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment