этот подход повторяется по всем элементам, даже если вы нашли массив. в вашем тестовом примере он будет повторяться по : asdf , и вам не нужно проверять это.
Я думаю, что вам нужно выйти из l oop, если вы нашли определенный тип (Массив в нашем примере).
found = false
[1,"a",[],:asdf].each do |x|
if x.is_a? Array
found = true
break
end
end
puts found
Также вы можете использовать любой вместо каждый
found = [1,"a",[],:asdf].any? { |x| x.is_a? Array }
puts found # true