Melhor maneira de escrever o programa "parênteses balanceados" em Ruby

Esse método deve pegar uma string e detectar se os colchetes '(' '{' '[' na string estão fechando corretamente com os colchetes correspondentes (opostos)).

Primeiro, existe uma maneira mais elegante e compacta de escrever esse bit sem usar todos os "ou" s (||):

            split_array.each do |i| 
              if (i == "{" || i == "(" || i == "[")
                  left.push(i)
                else (i == "}" || i == ")" || i == "]")
                  right.push(i)
                end
             end

Minha segunda pergunta é: esse código é terrível (veja abaixo)? Parece que eu devo escrever isso com menos linhas, mas logicamente, ainda não encontrei outra solução. O código funciona para a maioria dos testes, mas retorna falso para esse teste (veja todos os testes de driver em embaixo): p valid_string? ("[(text) {}]") == true

Qualquer crítica seria muito apreciada! (Além disso, se houver uma seção melhor para postar isso, entre em contato) Obrigado!

def valid_string?(string)

    opposites = { "[" => "]", "{" => "}", "(" => ")", "]" => "[", "}" => "{", ")" => "(" }

        left = Array.new
        right = Array.new
        return_val = true

        split_array = string.split(//)
        split_array.delete_if { |e| e.match(/\s/) }

          split_array.each do |i| 
          if (i == "{" || i == "(" || i == "[")
              left.push(i)
            else (i == "}" || i == ")" || i == "]")
              right.push(i)
            end
          end

        # p left
        # p right

        left.each_index do |i|
          if left[i] != opposites[right[i]]
              return_val = false
          end
        end  
        return_val
    end 

    p valid_string?("[ ] } ]") == false
    p valid_string?("[ ]") == true
    p valid_string?("[  ") == false                 
    p valid_string?("[ ( text ) ,{} ]") == true    
    p valid_string?("[ ( text { ) } ]") == false  
    p valid_string?("[ (] {}") == false 
    p valid_string?("[ ( ) ") == false

-------Atualizado: Depois de tentar algumas abordagens diferentes, meu refator é este:-----------

def valid_string?(str)

    mirrored = { "[" => "]", "{" => "}", "(" => ")" }
    open_brackets = Array.new

    split_str_array = str.split("")

    split_str_array.each do |bracket| 
      if bracket.match(/[\[|\{|\(]/) then open_brackets.push(bracket)
      elsif bracket.match(/[\]|\}|\)]/)
        return false if mirrored[open_brackets.pop] != bracket
      end
    end
    open_brackets.empty?
end 

questionAnswers(6)

yourAnswerToTheQuestion