DEV Community

Alexandre
Alexandre

Posted on

Usando os métodos da classe String no Ruby

String é uma sequência de caracteres.

O objeto string tem muitos métodos que você pode usar no seu projeto.

Aqui você vai aprender quase todos os métodos.

Índice


Então, vamos começar consultando a string.

Consultando string

Checando o tamanho da string

Primeiro, vamos saber qual é o tamanho da string.

Nós temos dois métodos que pode verificar o tamanho da string.

Exemplo:

nome = "Alexandre"
nome.length
#=> 9
# ou
nome.size
#=> 9
Enter fullscreen mode Exit fullscreen mode

Ambos métodos são iguais, então não faz diferenças você usar o length ou o size.

Agora vamos checar se a string está vazia.

Checando se a string está vazia

Aposto que você usaria o método length e compararia se ele é igual 0 para checar se ele está vazio.

Não tem problema usar ele, porém, no ruby temos método para isso.

Exemplo:

minha_barriga = ""
minha_barriga.empty?
#=> true
Enter fullscreen mode Exit fullscreen mode

Convenhamos que isso é mais bonito, né?

Agora vamos checar quantas letras que existe na string.

Checando a quantidade de letras

Às vezes, você quer saber a quantidade da letra "a" tem no string.

Exemplo:

letra = "Querido diário, desculpe o erro ao digitar..."
letra.count "i"
#=> 5
Enter fullscreen mode Exit fullscreen mode

Saiba que ele não conta a quantidade de palavra e sim os caracteres.

Exemplo:

letra = "Querido diário, desculpe o erro ao digitar..."
letra.count "dia"
#=> 11
Enter fullscreen mode Exit fullscreen mode

Viu, ele contou a letra "d", depois "i" e por fim o "a", e somou no final.

Agora sim, vamos verificar se existe uma palavra na string.

Checando a existência de uma palavra

Agora você quer saber se existe uma palavra ou conhecer a sua posição.

Tem alguns métodos que utiliza regex para buscar, porém, eu não vou demonstrar eles, então deixarei isso para outro tema.

Chega de papo, vamos ver os métodos.

Para saber a posição de um palavra, podemos usar o index.

Exemplo:

texto = "Você achou que eu estava brincando, hein, você achou!?"
texto.index "achou"
#=> 5
Enter fullscreen mode Exit fullscreen mode

Se você observar o texto, pode perceber que existe outro "achou", é possível pegar a posição dele?

Sim, é possível, basta usar rindex, ele busca a última palavra que existe no texto.

texto.rindex "achou"
#=> 47
Enter fullscreen mode Exit fullscreen mode

Mas eu não quero a posição dele, só quero saber se ele está na string.

Não tem problema, amigo!

Você pode usar include?.

texto = "Alexandre é um bacaca"
texto.include? "gente boa"
#=> false

texto.include? "bacaca"
#=> true
Enter fullscreen mode Exit fullscreen mode

Tem como eu saber que ele começa com uma palavra, ou se termina com ela?

Pode crer, meu amigo, existem métodos para isso.

Apresento-lhes os start_with? e end_with?.

nome_completo = "Alexandre dos Santos Alves"
nome.start_with? "Alexandre"
#=> true

nome.end_with? "Ferreira"
#=> false
Enter fullscreen mode Exit fullscreen mode

Acabamos com os métodos que checar a string, agora vamos para aprender a comparar as strings.

Comparando as strings

Não tem muitos mistérios em comparar, basta usar o == ou === que resolve o problema, só que, como que compara as string ignorando maiúsculas e as minúsculas?

Talvez você pense, deve ter um método que deixa a string maiúsculas/minúsculas e assim compara com ==.

Bem, Você não está errado, afinal de conta, existe o método que transformar a string em maiúsculas/minúsculas, que irei abordar lá abaixo.

Mas sabe como é, ruby tem método para isso.

Exemplo:

nome = "AlExaNDre"
nome.casecmp? "alexandre"
#=> true
Enter fullscreen mode Exit fullscreen mode

Simples.

Tem outros métodos que comparar, porém, não vou abordar-las.
Mas vou deixar uma lista de métodos que não abordei lá no final.

Agora vamos aprender a modificar o string.

Modificando string

Inserção

Bem, não tenho muito o que falar sobre inserção, então veja os exemplos.

Exemplos:

nome = "Alexandre"
nome << " dos Santos Alves"
nome
#=> "Alexandre dos Santos Alves"
Enter fullscreen mode Exit fullscreen mode

Tem uma coisa curiosa que vem em mente, e se eu colocar número, vai preencher com número?

Bem, se pensar superficialmente, sim deveria, porem... Vamos testar.

texto = "Alexandre tem " << 19
texto
#=> "Alexandre tem \u0013"
Enter fullscreen mode Exit fullscreen mode

Ué, cadê o 19?

Se você estudou um assunto que envolva isso, talvez tenha pego o que aconteceu, se não entendeu, não tem problema, vou explicar.

Eu te apresento a tabela ASCII.

Vou mostrar uma imagem de uma tabela.

Tabela ASCII

Podemos ver a tabela que contém números e caracteres, o que são eles?

Vamos pegar a nossa amiga Wikipédia para explicar isso.

Código Padrão Americano para o Intercâmbio de Informação (do inglês American Standard Code for Information Interchange - ASCII, pronunciado [áski]) é um sistema de representação de letras, algarismos e sinais de pontuação e de controle, através de um sinal codificado em forma de código binário (cadeias de bits formada por vários 0 e 1), desenvolvido a partir de 1960, que representa um conjunto de 128 sinais: 95 sinais gráficos (letras do alfabeto latino, algarismos arábicos, sinais de pontuação e sinais matemáticos) e 33 sinais de controle, utilizando 7 bits para representar todos os seus símbolos.

Ou seja, se você não entendeu a explicação, vou explicar de maneira fácil e resumida e ignorando coisa que não importa.

O número indica qual é o caractere que pertence a ele.

Por exemplo, 101, ele pertence a caractere "e", ou vice-versa, a letra "e" pertence o número 101, simples assim.

Agora vamos ver a tabela novamente, o número 19 fala sobre device control 3, ou seja, são informações irrelevantes para nós.

O que importa para gente são os números 32 até o 126, que são visíveis para nós, então vamos testar esses números.

texto = "Alexandre tem " << 49 << 57
texto
#=> "Alexandre tem 19"
Enter fullscreen mode Exit fullscreen mode

Ai está, mas sinceramente hein, para que fazer isso, basta colocar entre aspas no 19, que vai ser mais legível.

Mas é bom saber esse tipo de coisa, vai que algum momento da sua vida, você está usando isso e descobre que está dando erro em algum lugar e você não sabe.

Bem, vamos continuar.

Agora, você quer colocar uma letra ou palavra em um determinada posição. Por exemplo.

texto = "Hoje é o seu dia!"
texto.insert 5, "não "
#=> "Hoje não é o seu dia!"
Enter fullscreen mode Exit fullscreen mode

O primeiro parâmetro aceita o índice, e segundo aceita um string.

Agora vamos substituir uma palavra pela outra palavra.

Substituição

Bem, e se eu receber uma string desse jeito, "opa-como-vai",
beleza dá pra ler, só que eu não gosto esse simbolo de menos, então vamos trocar pelos espaços.

string = "opa-como-vai"
string.sub "-", " "
#=> "opa como-vai"
Enter fullscreen mode Exit fullscreen mode

Ué! Não trocou todos os símbolos.

Hum, deixe-me observar o método, o primeiro argumento é o "-" e segundo é " ", em que, logicamente, é para substituir o "-" para " ".

Ah, sou estúpido, esse método sub só troca a primeira letra ou palavra que for encontrado.

Vamos usar o método correto agora.

string = "opa-como-vai"
string.gsub "-", " "
#=> "opa como vai"
Enter fullscreen mode Exit fullscreen mode

Agora foi. Esse método gsub vai substituir todas as letras ou palavras que foi declarado no primeiro argumento para o segundo argumento.

Bem, agora eu não sei que vou explicar profundamente sobre o método replace ou se mostro um exemplo e você tira a sua própria conclusão.

Gostei mais da segunda opção, tome um exemplo.

nome = "Alexandre"
nome.replace "Paulo"
#=> "Paulo"
Enter fullscreen mode Exit fullscreen mode

Vou deixar um dever de casa para você.

nome = "Alexandre"
nome = "Paulo"
nome
#=> "Paulo"

nome = "Alexandre"
nome.replace "Paulo"
#=> "Paulo"
Enter fullscreen mode Exit fullscreen mode

Qual é a diferença entre atribuir uma string e usar o método replace?

Quero que você descubra, se for possível, poste a resposta no comentário.

Bem, vamos continuar.

.esrever o rasu a rednerpa somav arogA

Opa, algo deu errado. Deixe-me inverter isso.

texto = ".`esrever` o rasu a rednerpa somav arogA"
texto.reverse
#=> "Agora vamos aprender a usar o `reverse`."
Enter fullscreen mode Exit fullscreen mode

Pronto consertei.

Para mim, considero esse é o método mais inútil. Pois, eu não consigo pensar em usar esse método em algum lugar. A não ser que alguém esclareça para mim a utilidade dele.

Bem, vamos voltar com métodos úteis.

Maiúscula e minúscula

ToDoS NóS sAbeMos qUe um TEXtO BeM FEitO TEM que sEgUir aS rEGRas de maIúScUlas E minúSCuLas, sEnÃo vOCê vAi TeR difiCuLDAde em leR, cOmo AgORa.

Caso você receba um mensagem assim, basta usar o método capitalize que o ruby cuida disso.

paragrafo = "ToDoS NóS sAbeMos qUe um TEXtO BeM FEitO TEM..."
paragrafo.capitalize
#=> "Todos nós sabemos que um texto bem feito tem..."
Enter fullscreen mode Exit fullscreen mode

Agora quero deixar todas as letras em minúsculas.

Sem problema.

paragrafo = "ToDoS NóS sAbeMos qUe um TEXtO BeM FEitO TEM..."
paragrafo.downcase
#=> "todos nós sabemos que um texto bem feito tem..."
Enter fullscreen mode Exit fullscreen mode

E maiúsculas?

paragrafo = "ToDoS NóS sAbeMos qUe um TEXtO BeM FEitO TEM..."
paragrafo.upcase
#=> "TODOS NÓS SABEMOS QUE UM TEXTO BEM FEITO TEM..."
Enter fullscreen mode Exit fullscreen mode

E se eu quero trocar o maiúscula pela minúscula e vice-versa?

paragrafo = "ToDoS NóS sAbeMos qUe um TEXtO BeM FEitO TEM..."
paragrafo.swapcase
#=> "tOdOs nÓs SaBEmOS QuE UM texTo bEm feITo tem..."
Enter fullscreen mode Exit fullscreen mode

Isso é tudo sobre maiúscula e minúscula.

Agora vamos remover alguns caracteres da string.

Deletar uma palavra

Novamente, tenho dúvida com o método clear, parecido com replace, então eu vou mostrar um exemplo.

E se você soube responder sobre a diferença no método replace, aqui vai ser a mesma coisa.

nome = "Alexandre"
nome.clear
nome
#=> ""
Enter fullscreen mode Exit fullscreen mode

Mas, eu não quero apagar tudo, somente algumas coisas.

texto = "Não seja livre!"
texto.slice! "Não"
#=> "Não"
texto
#=> " seja livre!"
Enter fullscreen mode Exit fullscreen mode

O método slice aceita o vário tipo de argumento, como string, regex, range, começo/tamanho ou índice.

Vou mostrar um exemplo para cada argumento, menos regex.

Eu já mostrei do string acima.

# range
texto = "Não seja livre!"
texto.slice! 0..2
#=> "Não"
texto
#=> " seja livre!"

# começo/tamanho
texto = "Não seja livre!"
texto.slice! 0, 3
#=> "Não"
texto
#=> " seja livre!"

# índice
texto = "Não seja livre!"
texto.slice! 0
#=> "N"
texto
#=> "ão seja livre!"
Enter fullscreen mode Exit fullscreen mode

Eu não sei se você sabe a diferença de um método que tem exclamação e que não tem.

Então vou explicar, os métodos que tem exclamação como o slice, modifica o valor da variável, para que evite ficar atribuindo. Por exemplo.

nome = "alexandre"
nome = nome.capitalize
nome
#=> "Alexandre"
Enter fullscreen mode Exit fullscreen mode

Ao invés de fazer isso, faça isto.

nome = "alexandre"
nome.capitalize!
#=> "Alexandre"
Enter fullscreen mode Exit fullscreen mode

Muito mais reduzido, e mais legível. Porém, ele é perigoso, foi avisado.

Porque ele é perigoso?

Pelo fato de que pode modificar o próprio valor, e se houver uma situação em que você vai precisar o valor anterior, só que você acabou de perder e ai meu amigo, nem vou falar nada.

No final, eu vou colocar uma lista, os métodos que tem essa exclamação.

Bem, vamos continuar.

Agora, vamos supor que você recebe uma string assim "Allleexxandddrre", e quer tratar ele, removendo letra que se repete adjacente.

nome = "Allleexxandddrre"
nome.squeeze!
#=> "Alexandre"
Enter fullscreen mode Exit fullscreen mode

Tem vezes que um cliente da sua aplicação faz por engano ou pela maldade de colocar espaço em branco na esquerda, ou direita de uma string. Por exemplo.

campo = "                         opa"
# ou
campo = "opa                         "
# ou até
campo = "                         opa                       "
Enter fullscreen mode Exit fullscreen mode

Então para resolver, basta usar lstrip, rstripou strip.

Exemplo

campo = "                         opa"
campo.lstrip! # remove espaço em braco da esquerda
#=> "opa"

campo = "opa                         "
campo.rstrip! # remove espaço em braco da direita
#=> "opa"

campo = "                         opa                       "
campo.strip! # remove espaço em braco ambos lados
#=> "opa"
Enter fullscreen mode Exit fullscreen mode

Se você já pediu ao usuário alguma entrada usando o método gets, então já deve ter visto a quebra de linha no final da string.

string = gets
#=> "opa\n"
Enter fullscreen mode Exit fullscreen mode

Então remover isso basta usar o chomp, que remove o \n do final.

string = gets.chomp
#=> "opa"
Enter fullscreen mode Exit fullscreen mode

Convertendo para um novo string

Existem alguns métodos que acabam gerando um novo string, o que é o caso de não usar o "!" no final do método, porém, eu não vou abordar eles novamente, então sobra somente aqueles que não tem esse "!" no final.

Eu não sei se sou o único que faz isso, de printar uma linha no terminal para facilitar o meu "debug", por exemplo.

puts "--" * 20
# ----------------------------------------
Enter fullscreen mode Exit fullscreen mode

Isso me ajuda bastante, quando uso o ruby on rails que tem muita informação sendo mostrado no terminal.

Mas bem, esse é asterisco que faz uma operação de multiplicação de concatenar ele mesmo.

Não tem segredo sobre isso.

Mas quero concatenar duas string, simples use o +.

nome_1 = "Alexandre"
nome_2 = "Desconhecida"

nome_1 + " com " + nome_2
#=> "Alexandre com Desconhecida"
Enter fullscreen mode Exit fullscreen mode

Só que é meio feio, vamos dizer assim.

Mas não se preocupe tem um outro método que é o concat e adivinhe o que ele pode fazer.

nome = "Alexandre"

nome.concat(32, "com", 32, "Desconhecida")
#=> "Alexandre com Desconhecida"
Enter fullscreen mode Exit fullscreen mode

Viu teve o mesmo resultado, só que eu coloquei o número e ele transformou em espaço?

Vou te dar um spoiler sobre isso.

Começa com A e termina com I. suba que tem resposta lá em cima.

Bem, também é possível concatenar no começo da string usando o prepend.

nome = "Fome"
nome.prepend "Estou com "
#=> "Estou com Fome"
Enter fullscreen mode Exit fullscreen mode

Porém ele não aceita números, somente string.

Não sei se você já brincou com terminal, e queria deixa organizado o texto, como centralizar ele ou deixar na direita.

E saiu frustado, pois não conseguia.

Bem, o ruby vai facilitar esse trabalho para você.

texto = "Calculadora Foda"
texto.center 34
#=> "         Calculadora Foda         "
Enter fullscreen mode Exit fullscreen mode

voilá, ele centralizou.

Bem, vamos entender esse método.

Os argumentos que ele aceita é comprimento e o que vai cobrir nesse espaço vazio.

Um detalhe importante de se notar, é que o número que passei no exemplo acima é grande, porém, se você ver o que ele retornou, nem parece que foi 34 em espaço em branco.

Só que se você contar quantos caracteres tem, você vai ver que tem exatamente 34.

vamos usar o ruby para contar.

texto = "Calculadora Foda"
texto = texto.center 34
texto.length
#=> 34
Enter fullscreen mode Exit fullscreen mode

E se eu passar um número menor do tamanho da string?

Bem, não vai acontecer nada, veja.

texto = "Calculadora Foda"
texto.center 1
#=> "Calculadora Foda"
Enter fullscreen mode Exit fullscreen mode

E aquilo que você citou de cobrir o espaço vazio?

Observe.

texto = "Calculadora Foda"
texto.center 34, "="
#=> "=========Calculadora Foda========="
Enter fullscreen mode Exit fullscreen mode

Viu, é isso o que ele faz.

Mas se eu não quero centralizar e sim deixar ele na direita.

Sem problema, o método rjust é igual o center, só que colocar espaço branco a esquerda.

texto = "Status: 34%"
texto.center 34
#=> "                       Status: 34%"
Enter fullscreen mode Exit fullscreen mode

Então, se tem para esquerda, deve ter para direita?

Sim.

texto = "Baixando"
texto.center 34, "."
#=> "Baixando.........................."
Enter fullscreen mode Exit fullscreen mode

Pronto, acabamos com os métodos que gera um novo string, agora vamos partir para gera um não string.

Convertendo para um não string

Como assim um não string?

É qualquer classe que não seja String, por exemplo, Integer, Float, Array etc.

Vamos começar com Array.

Como eu posso transformar um texto em array?

Bem, depende, você quer um array com letras ou palavras?

Se quer letras, pode usar o métodos chars ou usar split para palavras.

Exemplos

texto = "Quem sou eu?"
texto.chars
#=> ["Q", "u", "e", "m", " ", "s", "o", "u", " ", "e", "u", "?"]

texto.split
#=> ["Quem", "sou", "eu?"]
Enter fullscreen mode Exit fullscreen mode

Bem, não tem nada para explicar sobre o método chars, então vamos para split.

Os argumentos que o split aceita são o delimitador e o tamanho do array.

Vamos para exemplos.

# definindo o delimitador
texto = "Me-perdi-na-profundeza-de-um-vasto-oceano..."
texto.split "-"
#=> ["Me", "perdi", "na", "profundeza", "de", "um", "vasto", "oceano..."]

# definindo o tamanho do array
texto.split "-", 3
#=> ["Me", "perdi", "na-profundeza-de-um-vasto-oceano..."]
Enter fullscreen mode Exit fullscreen mode

E se quisemos separar o texto de acordo com a quebra de linha?

Podemos usar o método lines.

texto = "Eu já tentei de tudo\nA minha mente acelera..."
texto.lines
#=> ["Eu já tentei de tudo\n", "A minha mente acelera..."]

# se quer tirar esse \n
texto.lines chomp: true
#=> ["Eu já tentei de tudo", "A minha mente acelera..."]
Enter fullscreen mode Exit fullscreen mode

Agora vamos string em inteiro ou float.

Não tem mistério.

numero_string = "120"
numero_strin.to_i
#=> 120

# transformando para float
numero_strin.to_f
#=> 120.0

# e se string for um float e transformar para inteiro
numero_string = "120.12"
numero_strin.to_i
#=> 120
Enter fullscreen mode Exit fullscreen mode

Tamos quase no fim.

Só mais dois métodos.

Métodos para Iterar

Usando each_char para iterar caracteres.

texto = "Sou o mestre do meu mar."
texto.each_char { |c| print c, ' ' }
# S o u   o   m e s t r e   d o   m e u   m a r .
Enter fullscreen mode Exit fullscreen mode

Usando each_line para iterar linhas.

texto = "Sou \no \nmestre \ndo \nmeu \nmar."
texto.each_line { |c| print c }
# Sou 
# o 
# mestre 
# do 
# meu 
# mar.
Enter fullscreen mode Exit fullscreen mode

E fim.

Conclusão

Se você chegou até aqui, meus parabéns por ter aguentando dessa longa jornada.

Com isso, você sabe quais são os métodos que existem na classe String, e usará ao seu favor, sem ter que reinventar a roda.

Bem, agora vou colocar as listas que prometi.

Lista de métodos que terminam com !

  • sub!
  • gsub!
  • reverse!
  • capitalize!
  • downcase!
  • upcase!
  • swapcase!
  • slice!
  • squeeze!
  • delete!
  • lstrip!
  • rstrip!
  • strip!
  • chomp!
  • chop!

Lista de métodos que não foram mencionados

  • #+string
  • #-string
  • bytesize
  • #=~
  • match
  • match?
  • encoding
  • unicode_normalized?
  • valid_encoding?
  • ascii_only?
  • sum
  • hash
  • eql?
  • #<=>
  • casecmp
  • succ!, next!
  • setbyte
  • tr!
  • tr_s!
  • encode!
  • unicode_normalize!
  • scrub!
  • force_encoding
  • b
  • dump
  • undump
  • %
  • delete_prefix
  • delete_suffix
  • byteslice
  • chr
  • to_s, $to_str
  • bytes
  • codepoints
  • getbyte
  • grapheme_clusters
  • partition
  • rpartition
  • unpack
  • unpack1
  • hex
  • oct
  • ord
  • inspect
  • to_sym, intern
  • each_byte
  • each_codepoint
  • each_grapheme_cluster
  • upto

Grande né. Talvez um dia eu abordo eles.

Bem, Agradeço por ter lido até aqui e espero que isso tenha ajudado.

Tchau!

Latest comments (0)