This example only needs a list and a function to DRY it all up. Depending on the expected size of the list, one could set variable that stores the count value.

arr = [1, 2, 3, 4, 5]

def power(x)
    puts x**x
    yield if block_given?
end

arr.take(arr.count - 1).each {|x| power(x) }
# 1
# 4
# 27
# 256

power(arr.last) { puts "last element" }
# 3125
# last element

“What’s that yield?”, you might ask.

Mastering Ruby blocks in 5 minutes