class AST::Index attr_reader :object, :key def initialize(object, key) @object = object @key = key end def ==(other) other.is_a?(AST::Index) && other.object == @object && other.key == @key end def execute(env) object = @object.execute(env) key = @key.execute(env) if object.is_a?(Array) if key.is_a?(Float) if key.to_i == key && object.size > key object[key] elsif key.to_i != key raise "Array index requires integer key" elsif object.size <= key raise "Array index out of bounds" end else raise "Array index requires integer key" end elsif object.is_a?(Hash) if object.has_key?(key) object[key] else raise "Key #{key} does not exist on object" end end end end