Sunday, December 13, 2015

Implementing Abs using Objects

def absolute(x)
if x > 0
x
elsif x == 0
0
elsif x < 0
-x
end
end

# p absolute(0)

class GreaterThan

def initialize(value, number)
@value, @number = value, number
end

def evaluate
result[@number.send(:>, @value).class]
end

private

def result
{TrueClass => @number}
end
end

# c = GreaterThan.new(0, -2)
#
# p c.evaluate

class LessThan

def initialize(value, number)
@value, @number = value, number
end

def evaluate
result[@number.send(:<, @value).class]
end

private

def result
{TrueClass => -@number}
end
end

# c = LessThan.new(0, -2)
#
# p c.evaluate

class EqualTo

def initialize(value, number)
@value, @number = value, number
end

def evaluate
result[@number.send(:==, @value).class]
end

private

def result
{TrueClass => 0}
end
end

# c = EqualTo.new(0, 0)
#
# p c.evaluate

def obzolute(x)
[GreaterThan.new(0, x), LessThan.new(0, x), EqualTo.new(0,x)].each do |predicate|
unless predicate.evaluate.nil?
return predicate.evaluate
end
end
end

p obzolute(0)
p obzolute(-1)
p obzolute(2)

Second Version

class Predicate
def initialize(operator, value)
@operator, @value = operator, value
end

def evaluate
@value.send(@operator.to_sym, 0)
end

def result
{'>' => @value, '==' => 0, '<' => -@value}
end

end

p1 = Predicate.new('<', -1)

p (p1.evaluate and p1.result['<'])

p2 = Predicate.new('==', 0)

p (p2.evaluate and p2.result['=='])

p3 = Predicate.new('>', 2)

p (p3.evaluate and p3.result['>'])