You can easily see what happens if you extract part of the interpolation into a variable:
alfawit = ("a".."z") foo = alfawit.each { |litera| puts litera } puts "That an alphabet: \n\n #{ foo } "
The second line causes a problem: each calls a block for each element of the range, and then returns the receiver, so that foo becomes alfawit .
Here is another way to get the desired result:
alfawit = "a".."z" puts "That an alphabet:", alfawit.to_a
puts displays each argument on a new line, but for array arguments, it displays each element on a new line. Result:
That an alphabet: a b c ⋮ x y z
Similarly, you can turn a range into an argument list with * :
alfawit = "a".."z" puts "That an alphabet:", *alfawit
This is equivalent to:
puts "That an alphabet:", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"