Observação: Este artigo foi atualizado, caso queira a versão anterior, pode acessá-la aqui
Bem, primeiramente, vamos entender o que é uma String.
Uma String nada mais é do que um conjunto de caracteres, ou melhor, é um conjunto de bytes que representa o texto.
No Ruby, a classe String
possui muitos métodos que você pode usar em seu projeto. Então, vamos explorar esses métodos.
Mas antes de vermos os métodos, primeiro, temos que saber como criar uma String no Ruby. Afinal, como vamos testar os métodos sem uma String?
Índice
- Criando Strings
- Consultando
- Modificando
- Iterando
- Convertendo em Uma Nova String
- Convertendo Uma String em Uma Não-String
- Conclusão
Criando Strings
Existem cinco formas, ou melhor, existem seis formas de criar uma String.
Aspas Duplas
As primeiras delas é, simplesmente, usar aspas duplas ""
. Vamos a um exemplo.
nome = "Alexandre"
Bem, nada demais, né? Certo, mas se eu quisesse, sei lá, ter um texto grande, como posso fazer isso?
Certo, tem uma forma melhor, mas quero abordar como faria usando aspas. Então, veja o exemplo abaixo.
texto = "Mal me lembro quando foi a última vez Que algo que eu falei fez diferença Mesmo depois de todas as coisas que eu fiz..."
Você percebe que isso não é agradável, mas não se preocupe, tem como melhorar isso, vamos lá, então.
texto = "Mal me lembro quando foi a última vez" \
"Que algo que eu falei fez diferença" \
"Mesmo depois de todas as coisas que eu fiz..."
Bem melhor, né? Então, suponho que você tenha percebido o \
. Mas, bem, como ele funciona?
Não há necessidade de saber como ele funciona, mas, basicamente, quando o interpretador - caso não saiba o que é um interpretador, recomendo que pesquise sobre interpretador e compilador para entender mais sobre isso - "ver" o \
seguido de "
, ele verifica se há uma string na próxima linha para fazer uma concatenação, só isso.
Tudo o que você precisa saber é colocar um \
seguido de "
e garantir que tenha uma string na próxima linha.
Mas existe um problema sobre isso. Você consegue adivinhar? Copie o código e rode um puts
na variável texto para ver o que acontece.
puts texto
#Mal me lembro quando foi a última vezQue algo que eu falei fez diferençaMesmo depois de todas as coisas que eu fiz...=> nil
Pode ver que o texto foi concatenado, sem espaço. Era óbvio que isso iria acontecer, então para resolver, basta colocar o espaço ou, então, colocar \n
.
texto = "Mal me lembro quando foi a última vez " \
"Que algo que eu falei fez diferença " \
"Mesmo depois de todas as coisas que eu fiz..."
puts texto
#Mal me lembro quando foi a última vez Que algo que eu falei fez diferença Mesmo depois de todas as coisas que eu fiz...=> nil
texto = "Mal me lembro quando foi a última vez\n" \
"Que algo que eu falei fez diferença\n" \
"Mesmo depois de todas as coisas que eu fiz..."
puts texto
#Mal me lembro quando foi a última vez
#Que algo que eu falei fez diferença
#Mesmo depois de todas as coisas que eu fiz...=> nil
Caso você não saiba o que é o \n
, pesquise sobre "caracteres de escape".
Bem, creio que é só isso. Agora vamos para a segunda forma de criar uma string.
Aspas Simples
É a mesma coisa que a primeira, porém com aspas simples '
, só que tem uma coisa que difere com as aspas duplas, que é o uso de caracteres de escape.
Vamos fazer um teste.
# Aspas Duplas
texto = "Um,\nDois,\nTrês"
puts texto
#Um,
#Dois,
#Três
# Aspas Simples
texto = "Um,\nDois,\nTrês"
puts texto
#Um,\nDois,\nTrês
Viu? Os caracteres de escape não funcionam na aspas simples, então preste atenção nisso, caso vá usar as aspas simples.
Heredoc
Agora, vamos para a terceira forma de criar uma string. No entanto, essa forma é só útil para criar uma string multilinha, pois usar vários \
não é agradável, então para fazer isso é simples.
Vou mostrar o exemplo.
texto = <<HEREDOC
Eu sei que nada é pra sempre
Confesso que eu queria um pouco mais
De tempo pra usar pra gente
Ver o sorriso que só você traz
HEREDOC
puts texto
#Eu sei que nada é pra sempre
#Confesso que eu queria um pouco mais
#De tempo pra usar pra gente
#Ver o sorriso que só você traz
É assim que se cria uma string multilinha, só que vou te contar um segredo, o HEREDOC
não precisa ser necessariamente HEREDOC
, você pode usar qualquer nome, pode ser TEXTÃO
, TEXTINHO
, seja lá o que for, mas, é claro, o recomendado é HEREDOC
.
Mas tem um problema de usar isso. Vamos supor que você tenha um método e esteja atribuindo o textão
dentro desse método, você verá que ele vai dar erro de não encontrar o final do texto, mas para resolver isso é simples.
def escrever_textão
texto = <<-TEXTÃO
Eu sei que nada é pra sempre
Confesso que eu queria um pouco mais
De tempo pra usar pra gente
Ver o sorriso que só você traz
TEXTÃO
puts texto
end
escrever_textão
#Eu sei que nada é pra sempre
#Confesso que eu queria um pouco mais
#De tempo pra usar pra gente
#Ver o sorriso que só você traz
Você percebeu a diferença, claro, tirando o uso do nome TEXTÃO
?
Creio que é difícil perceber, mas observe bem no <<-TEXTÃO
, é possível ver um -
depois do <<
, isso vai garantir que não terá erro. E uma coisa que você possa ter percebido é que o texto não está aninhado de acordo com o método, isso porque se ele estiver aninhado com o método, o texto atribuído também vai estar aninhado. Aqui está um exemplo.
def escrever_textão
texto = <<-TEXTÃO
Eu sei que nada é pra sempre
Confesso que eu queria um pouco mais
De tempo pra usar pra gente
Ver o sorriso que só você traz
TEXTÃO
puts texto
end
escrever_textão
# Eu sei que nada é pra sempre
# Confesso que eu queria um pouco mais
# De tempo pra usar pra gente
# Ver o sorriso que só você traz
Mas caso você queira que esteja aninhado com o método, basta trocar o -
para ~
, simples assim.
def escrever_textão
texto = <<~TEXTÃO
Eu sei que nada é pra sempre
Confesso que eu queria um pouco mais
De tempo pra usar pra gente
Ver o sorriso que só você traz
TEXTÃO
puts texto
end
escrever_textão
#Eu sei que nada é pra sempre
#Confesso que eu queria um pouco mais
#De tempo pra usar pra gente
#Ver o sorriso que só você traz
É só isso. Ainda tem mais alguma coisa, mas mostrarei em outro artigo, pois não envolve muito com o String em si.
String.new
Agora, vamos para a quarta forma de criar uma string.
Essa forma é simples, é simplesmente criar uma instância de String. Veja o código abaixo.
nome = String.new('Alexandre')
Então, você se pergunta, qual é a diferença entre usar aspas duplas ou simples e usar o método new
?
Bem, nenhuma, ou melhor, tem uma única diferença, você pode definir a Codificação (Encoding) no new
.
Se não sabe o que é Encoding, recomendo pesquisar sobre. Farei um artigo sobre isso no futuro.
Por padrão, ao utilizar aspas duplas ou simples, o encoding será UTF-8
, e usando o String.new
sem argumentos será ASCII-8BIT
. Veja o código abaixo.
nome = 'Alexandre'
nome.encoding
#=> #<Encoding:UTF-8>
nome = String.new
nome.encoding
#=> #<Encoding:ASCII-8BIT>
nome = String.new('Alexandre')
nome.encoding
#=> #<Encoding:UTF-8>
Não aprofundarei o assunto do Encoding, pois farei um artigo sobre isso.
% ou %Q
Agora, vamos para a quinta e a sexta forma de criar uma string. Vou juntar as duas, pois são meio parecidas.
É meio parecido com as aspas, porém a utilidade é que você pode incluir aspas dentro do texto. Não entendeu? Não se preocupe, vou mostrar o código.
texto = %[Esse código é meio "estranho"]
puts texto
#Esse código é meio "estranho"
Viu? Sinceramente, o único ponto forte dele é este, ter a capacidade de colocar as aspas sem ter que usar o \
. Por exemplo:
texto = "Esse código é meio \"estranho\""
puts texto
#Esse código é meio "estranho"
Então, se você vai usar as aspas e não quer usar o \
, você pode usar ele.
Uma observação, eu falei que tinha duas formas, e só falei uma, mas antes de falar disso, eu quero te mostrar uma coisa.
%[Era uma vez] #=> Era uma vez
%(Era uma vez) #=> Era uma vez
%{Era uma vez} #=> Era uma vez
%<Era uma vez> #=> Era uma vez
%|Era uma vez| #=> Era uma vez
%:Era uma vez: #=> Era uma vez
Entendeu? Você tem essas opções de criar uma string, então você escolhe qual te agrada mais.
%q
Agora, vamos voltar ao assunto anterior. Você sabe que existem diferenças entre as aspas duplas e as aspas simples, mas também tem essa diferença aqui. Para isso, veja o código abaixo.
# Mesmo comportamento de aspas duplas
texto = %["Um",\"nDois",\n"Três"]
puts texto
#"Um",
#"Dois",
#"Três"
# Mesmo comportamento de aspas simples
texto = %q["Um",\n"Dois",\n"Três"]
puts texto
#"Um",\n"Dois",\n"Três"
Como você pode ver, para ter o mesmo comportamento de uma aspa simples, basta usar o %q
. Só isso.
Aproveitando o conhecimento da diferença, vou abordar logo a interpolação de strings antes de partir para conhecer os métodos.
Interpolação de Strings
Vou te fazer um desafio.
def ola_fulano(nome_do_fulano)
# ?
end
ola_fulano('Alexandre')
#Olá, Alexandre!
ola_fulano('Kauane')
#Olá, Kauane!
ola_fulano('Felipe')
#Olá, Felipe!
Como você faria isso para ter o resultado esperado?
Existem duas formas de fazer isso. Primeiro, vou mostrar a menos recomendada.
def ola_fulano(nome_do_fulano)
puts 'Olá, ' + nome_do_fulano + '!'
end
Simples assim, mas por que é a menos recomendada?
Vou citar dois motivos:
- Não é bonito.
- E neste código, você está criando três strings, ou seja, está alocando três objetos na memória.
Explicando mais sobre o motivo 2, como que está criando três strings? A primeira string criada é "Olá, "
, a segunda é "!"
e a terceira é o resultado da concatenação.
Sinceramente, isso não é um problema, isso só vai se tornar um problema se você tiver um projeto bem complexo e também bem específico. Mas é bom saber disso, vai que, né?
A forma mais recomendada é:
def ola_fulano(nome_do_fulano)
puts "Olá, #{nome_do_fulano}!"
end
Simples e bonito, não acha? Basta colocar uma variável dentro do #{}
e puf. Mas não é só isso, você pode colocar um método que retorna algum valor ou, então, colocar um número ou uma operação matemática, veja um exemplo abaixo.
def ola
'Olá'
end
puts "#{ola}, Alexandre!"
#Olá, Alexandre!
puts "Eu tenho #{2024 - 2003}!"
#Eu tenho 21!
Agora, vamos testar com aspas simples, e também com %
e %q
.
puts %[#{ola}, Alexandre!]
#Olá, Alexandre!
puts '#{ola}, Alexandre!'
##{ola}, Alexandre!
puts %q[#{ola}, Alexandre!]
##{ola}, Alexandre!
Ué, bem, isso já era o esperado, eu já disse isso anteriormente. As aspas simples e %q
também não aceitam interpolação.
Bem, acho que é isso, agora, finalmente, vamos partir para os métodos. Vamos aprender os métodos de consulta.
Consultando
O que seria consultar uma string? Bem, consultar? Acho que é mais fácil entender vendo os exemplos abaixo.
Consultando o Tamanho da String
Veremos dois métodos para saber quantos caracteres tem na string.
nome = 'Alexandre'
nome.length
#=> 9
nome.size
#=> 9
Não há nenhuma diferença entre os dois métodos, então você pode usar qualquer um.
Mas eu quero saber quantos bytes tem na string. Sem problema.
nome.bytesize
#=> 9
O resultado também foi 9
, assim como o length
e o size
. Mas por quê?
Bem, isso tem a ver com Encoding
, mas, resumidamente, a string Alexandre
contém apenas caracteres ASCII, ou seja, cada caractere ocupa um byte. Agora, vamos colocar um acento no A
para ver o que acontece.
nome = 'Álexandre'
nome.bytesize
#=> 10
Viu? Retornou 10. Isso acontece porque o Á
não pertence ao ASCII, então ele ocupa dois bytes. Resumidamente, é isso. Como disse antes, farei um artigo sobre Encoding
.
Agora, vamos supor que eu queira saber se a string está vazia. Eu posso fazer assim?
nome = ''
nome.size == 0
#=> true
Sim, você pode, mas temos um método para isso.
Consultando se a String está Vazia
O método é empty?
, vamos ver um exemplo.
nome.empty?
#=> true
Bem mais bonito, né?
Certo, agora eu quero saber o número total de um caractere em uma string.
Consultando a Quantidade de Caracteres
Vamos supor que você queira saber quantas vezes o caractere a
aparece no texto. É bem simples.
texto = 'Querido diário, desculpe o erro ao digitar. Mas minha mão treme...'
texto.count 'a'
#=> 4
Bem, não tem muito mistério nisso.
Então, funciona somente com um caractere? Bem, antes de eu responder isso, é melhor que você veja o resultado.
Vamos supor que queiramos saber quantas vezes aparece a palavra erro
no texto.
texto.count 'erro'
#=> 18
Ué, não era para ser 1
?
Então... Nâo. Em momento nenhum citei substrings, eu citei apenas caracteres. Mas por que deu 18?
É uma soma simples. O número total do caractere e
que aparece no texto é 6, o de r
é 6 e o de o
é 6. Somando todos, dá 18.
Tá, mas eu quero saber quantas vezes aparece a substring erro
na string.
Bem, não tem método específico para isso, mas vou te mostrar uma forma de fazer isso.
texto.scan('erro').size
#=> 1
É assim... Bem, acho melhor dar um passo para trás. Vamos entender sobre o método scan
.
Consultando a Quantidade de Substrings
O método scan
pode receber uma string ou um RegEx (Regular expression). No futuro, farei um artigo sobre RegEx. Então, neste artigo, não terá nada de RegEx.
Vamos ver o que o método scan
retorna.
texto = 'O sabiá não sabia que o sábio sabia que o sabiá não sabia assobiar.'
texto.scan('sabiá')
#=> ["sabiá", "sabiá"]
Hum... ele retornou um Array com dois elementos. Certo, creio que dá para entender o que aconteceu aqui. É por isso que se utiliza o size
ou length
para saber a quantidade.
Como disse antes, ele também aceita um RegEx. Vou mostrar um exemplo, mas não explicarei sobre isso.
Vamos supor que eu queira saber quantas vezes aparecem o sabiá
e o sábio
, juntos, é claro.
texto.scan(/s[áa]bi[áo]/)
#=> ["sabiá", "sábio", "sabiá"]
Bem, acho que é isso.
Aproveitando o embalo, vamos ver um método para saber a posição de um substring.
Consultando a Posição de Substrings
Temos dois métodos: index
e rindex
. Esses métodos aceitam dois argumentos. O primeiro argumento pode ser uma string ou uma RegEx, e o segundo é o offset, que é opcional.
Vamos para um exemplo.
texto = "Não sei o que dizer, não sei como expressar"
texto.index 'sei'
#=> 4
Se observar o texto, é possível perceber que tem um outro "sei". É possível saber a posição dele?
Sim, você pode usar o segundo argumento.
O que seria o offset? Ele é basicamente o ponto de partida dele.
Sabemos que a posição do primeiro "sei" é 4, então, vamos fazer o método começar a partir da posição 5. Por exemplo:
texto.index('sei', 5)
#=> 25
Bem, e o rindex
?
É a mesma coisa, porém ele vai de direita para esquerda. Por exemplo:
texto.rindex 'sei'
#=> 25
Viu? retornou 25.
Mas o que acontece quando não tem a substring no texto? Vamos ver juntos, então.
texto.index 'eu'
#=> nil
Ele retornou nil.
Então, eu posso usar esse método para saber se existe ou não no texto?
Sim, pode, mas temos um método para isso.
Consultando a Existência de Substrings
Temos o método include?
. Vamos ver um exemplo.
texto = 'Alexandre é babaca.'
texto.include? 'legal'
#=> false
texto.include? 'babaca'
#=> true
Certo, nada demais.
Também temos os métodos match
e match?
, mas como isso lida com RegEx, novamente, abordarei esses métodos em outro artigo.
Continuando o embalo de saber se substring está no texto, temos os métodos start_with?
e end_with?
.
O start_with?
verifica se a substring está no começo do texto, e o end_with?
verifica se a substring está no final do texto.
Esses métodos aceitam string e RegEx.
Por exemplo:
texto = 'Mas acho que vale a pena.'
texto.start_with? 'Mas'
#=> true
texto.start_with? 'pena.'
#=> false
texto.end_with? 'Mas'
#=> false
texto.end_with? 'pena.'
#=> true
Fácil de entender, tem mais uma coisa que eu quero te mostrar sobre esses dois métodos.
texto.start_with?('Contudo', 'Porém', 'Todavia', 'Mas')
#=> true
texto.start_with?('Contudo', 'Porém', 'Todavia', 'No entanto')
#=> false
Entendeu? Bem, os métodos podem receber "infinitos" argumentos, nos quais eles vão verificar se os argumentos estão no começo ou no fim do texto.
Bem, para finalizar a parte de consulta, vamos saber como comparar duas strings.
Comparando Strings
Com certeza, você já sabe que dá pra comparar usando ==
ou ===
.
Tem um método eql?
que é igualzinho a ==
ou ===
, isso é só para pessoas que preferem usar esse método em vez de ==
ou ===
.
Mas, beleza. Como posso comparar duas strings desconsiderando as letras maiúsculas e minúsculas? Tem um método que converte o texto para minúsculas ou para maiúsculas, mas abordarei isso depois.
Mas não se preocupe, temos um método para isso, que é o casecmp?
. Veja o exemplo abaixo.
comida = 'Arroz'
comida == 'arroz'
#=> false
comida.casecmp? 'arroz'
#=> true
Simples assim. Também temos o método casecmp
sem a interrogação. Esse método, em vez de retornar true
ou false
, retorna -1
, 0
ou 1
.
É um pouco difícil explicar isso, então vou mostrar um exemplo.
comida_1 = 'Arroz'
comida_2 = 'Feijão'
# Para retornar -1, a comida_1 deve ser menor que a comida_2
comida_1.casecmp comida_2
#=> -1
# Para retornar 0, a comida_1 deve ser igual à comida_2
comida_2 = 'arroz'
comida_1.casecmp comida_2
#=> 0
# Para retornar 1, a comida_1 deve ser maior que a comida_2
comida_1 = 'Cachorro quente'
comida_1.casecmp comida_2
É um método bem específico, mas vai que, né?
Também tem um outro método que é parecido com o casecmp
, só que ele é sensível às letras minúsculas e maiúsculas.
Esse método é o <=>
. Veja um exemplo.
comida_1 = 'Arroz'
comida_2 = 'Feijão'
# Para retornar -1, a comida_1 deve ser menor que a comida_2
comida_1 <=> comida_2
#=> -1
# Para retornar 0, a comida_1 deve ser igual à comida_2
comida_2 = 'Arroz'
comida_1 <=> comida_2
#=> 0
# Para retornar 1, a comida_1 deve ser maior que a comida_2
comida_1 = 'Cachorro quente'
comida_1 <=> comida_2
#=> 1
Bem, finalmente, terminamos a parte de consulta. Agora, vamos para a parte de modificação.
Modificando
Vamos aprender a modificar a string, seja inserindo, substituindo, deletando ou capitalizando.
Inserção
Certo, sem muita delonga, vamos ver um exemplo.
nome_completo = 'Alexandre'
nome_completo << ' dos Santos Alves'
nome_completo
#=> "Alexandre dos Santos Alves"
Viu? Simples. Tem uma coisa curiosa que pensei agora. Se eu colocar um inteiro, o que vai acontecer?
texto = 'Alexandre tem ' << 21 << '.'
texto
#=> "Alexandre tem \u0015."
Ué. Por que está \u0015
? Onde está o 21
? Bem, a resposta é simples.
Quando você está inserindo um inteiro, o método vai considerar esse inteiro como um código ASCII e convertê-lo em um caractere.
Veja a tabela abaixo para entender mais.
O número 21 é o Negative Acknowledge, que é \u0015
ou U+0015
. Então, para colocar um inteiro na string, você precisa convertê-lo para string. Por exemplo:
texto = 'Alexandre tem ' << String(21) << '.'
# ou
texto = 'Alexandre tem ' << 21.to_s << '.'
Agora, vamos para um outro método.
texto = 'Hoje é o seu dia!'
texto.insert(5, 'não ')
#=> "Hoje não é o seu dia!"
Novamente, é simples. o primeiro argumento é a posição em que será inserido e o segundo argumento é a string que será inserida.
Se o primeiro argumento for negativo, começará pelo final da string. Por exemplo:
texto = 'Hoje é o seu dia!'
texto.insert(-13, 'não ')
#=> "Hoje não é o seu dia!"
Certo, agora vamos para substituição.
Substituição
Vamos supor que eu receba isso: "Por-que-me-olham-estranho?". Como posso trocar o -
por espaço?
Temos dois métodos, o sub
e o gsub
.
Vamos primeiro para o método sub
.
texto = 'Por-que-me-olham-estranho?'
texto.sub!('-', ' ')
texto
#=> "Por que-me-olham-estranho?"
Ué? Só trocou o primeiro, e o resto?
Bem, é que este método só troca a primeira ocorrência. Mas temos o outro método gsub
, que vai trocar todas as ocorrências.
texto = 'Por-que-me-olham-estranho?'
texto.gsub!('-', ' ')
texto
#=> "Por que me olham estranho?"
Viu?
Não sei se você sabe, mas existem alguns métodos que têm o !
. Caso você não saiba, todos os métodos que têm o !
significam que a string em si será alterada. Vamos a um exemplo para facilitar.
# Sem !
texto = 'Por-que-me-olham-estranho?'
texto.gsub('-', ' ')
texto
#=> "Por-que-me-olham-estranho?"
# Com !
texto = 'Por-que-me-olham-estranho?'
texto.gsub!('-', ' ')
texto
#=> "Por que me olham estranho?"
Percebeu a diferença? Basicamente, o método gsub
não altera a string da variável texto
, o que ele faz é criar uma nova string. Mas como essa nova string não está sendo atribuída a nenhuma variável, ela é jogada fora.
No final deste subcapítulo sobre substituição, vou colocar uma lista de métodos que possuem o !
.
Ah, e um aviso, os métodos que possuem o !
podem ser perigosos no sentido de perder a informação, então fique atento.
Certo, agora vamos para um método que seria interessante para você pensar, pois não vou explicar nada sobre isso.
O método é replace
, ele é bem simples.
nome = 'Alexandre'
nome.replace 'Zacarias'
nome
#=> "Zacarias"
Agora, deixe-me mostrar um outro código.
nome = 'Alexandre'
nome.replace 'Zacarias'
nome
#=> "Zacarias"
nome = 'Alexandre'
nome = 'Zacarias'
nome
#=> "Zacarias"
Minha pergunta é: Qual é a diferença entre eles? Você sabe responder?
Bem, vamos continuar.
.esrever
odotém o rasu a rednerpa somav arogA
Opa, algo deu errado. Deixe-me consertar isso.
texto = ".`esrever` odotém o rasu a rednerpa somav arogA"
texto.reverse!
texto
#=> "Agora vamos aprender a usar o método `reverse`."
Pronto, consertado.
Sinceramente, eu considero este método mais inútil, pois não consigo pensar em que tipo de situação eu usaria isso.
Certo, terminamos a parte de substituição. Mas antes disso, vou mostrar a lista.
-
sub
=>sub!
-
gsub
=>gsub!
-
reverse
=>reverse
Também vou mostrar uma lista de métodos que não abordei, pois deixaria esse artigo muito grande.
succ
next
setbyte
tr
tr_s
Pronto, agora terminei. Vamos para a deleção.
Capitalização
TOdOs nÓs SaBeMoS qUe LeR uM tExTo DeSse JEItO É nADA AgRaDáVeL, eNtÃO VaMoS CoNsErTaR iSsO. TEmOs tRêS méTOdOs qUe PosSam rESOlvEr iSsO.
paragrafo = 'TOdOs nÓs SaBeMoS qUe LeR uM tExTo DeSse JEItO...'
paragrafo.capitalize!
paragrafo
#=> "Todos nós sabemos que ler um texto desse jeito..."
O método capitalize
faz a primeira letra em maiúscula e o resto em minúsculas.
paragrafo = 'TOdOs nÓs SaBeMoS qUe LeR uM tExTo DeSse JEItO...'
paragrafo.downcase!
paragrafo
#=> "todos nós sabemos que ler um texto desse jeito..."
O método downcase
deixa todas as letras em minúsculas.
paragrafo = 'TOdOs nÓs SaBeMoS qUe LeR uM tExTo DeSse JEItO...'
paragrafo.upcase!
paragrafo
#=> "TODOS NÓS SABEMOS QUE LER UM TEXTO DESSE JEITO..."
O método upcase
deixa todas as letras em maiúsculas.
Também temos um método que inverte as letras maiúsculas para minúsculas e vice-versa.
paragrafo = 'TOdOs nÓs SaBeMoS qUe LeR uM tExTo DeSse JEItO...'
paragrafo.swapcase!
paragrafo
#=> "toDoS NóS sAbEmOs QuE lEr Um TeXtO dEsSE jeiTo..."
Estes quatro métodos que abordei também têm a versão sem o !
.
Agora, vamos para a deleção.
Deleção
O método que vou apresentar tem o mesmo comportamento do replace
, porém, ele limpa a string.
nome = 'Alexandre'
nome.clear
nome
#=> ""
Vou fazer a mesma pergunta que fiz com replace
. Qual é a diferença entre eles?
nome = 'Alexandre'
nome.clear
nome
#=> ""
nome = 'Alexandre'
nome = ''
nome
#=> ""
Certo, mas eu não quero apagar tudo, eu quero remover alguns caracteres.
Simples, é usar o slice
.
texto = 'Não seja livre!'
texto.slice! 'Não '
#=> "Não "
texto
#=> "seja livre!"
O método slice
aceita vários tipos de argumentos, como String, Range, RegEx, início/tamanho e índice.
Por exemplo:
# Range
texto = 'Não seja livre!'
texto.slice! 0...4
#=> "Não "
texto
#=> "seja livre!"
# RegEx
texto = 'Não seja livre!'
texto.slice!(/s.{4}/)
#=> "seja "
texto
#=> "Não livre!"
# Início/tamanho
texto = 'Não seja livre!'
texto.slice!(0, 4)
#=> "Não "
texto
#=> "seja livre!"
# Índice
texto = 'Não seja livre!'
texto.slice!(0)
#=> "N"
texto
#=> "ão seja livre!"
Agora, vou mostrar um método que, antes, eu pensava ser inútil, mas agora consigo pensar em situações em que ele seria útil. Esse método é o squeeze
.
texto = 'Era uma vez um rei egoísta.'
texto.squeeze!
texto
#=> "Era uma vez um rei egoísta."
O que ele faz é basicamente remover caracteres que se repetem um ao lado do outro.
Existe um problema nisso, você sabe qual é? Deixe-me mostrar um exemplo.
texto = 'Tem um problema nisso.'
texto.squeeze!
texto
#=> "Tem um problema niso."
Viu? Ele removeu o s
da palavra nisso
, mas para resolver isso, é super de boa.
O método aceita um argumento chamado Character Selector
, que é basicamente uma string.
Mas, antes de explicar isso, vamos partir para o método delete
, pois ele também aceita o mesmo argumento. A mesma coisa se aplica ao método count
, que foi abordado, mas que eu acabei não explicando no momento, pois queria explicar isso agora.
texto = 'O rato roeu a roupa do rei de Roma.'
texto.delete! 'r'
texto
#=> "O ato oeu a oupa do ei de Roma."
Nada complicado, ele deletou todos os caracteres r
do texto.
Agora que o método foi explicado, vou falar sobre o Character Selector
. A maneira mais fácil de explicar é mostrando o código com comentários.
# Removendo os caracteres A, R e O
texto = 'O rato roeu a roupa do rei de Roma.'
texto.delete! 'aro'
texto
#=> "O t eu up d ei de Rm."
# Removendo os caracteres de A a E
texto = 'Não soube viver, até que um dia'
texto.delete! 'a-e'
texto
#=> "Não sou vivr, té qu um i"
# Colocando o - entre dois caracteres, será interpretado que é para remover o tal a tal
# Removendo o caractere A e os caracteres de R a U.
texto = 'Então, senta e ouve essa história'
texto.delete! 'ar-u'
texto
#=> "Enão, en e ove e hiói"
# Removendo todos os caracteres com exceção de R
texto = 'O rato roeu a roupa do rei de Roma.'
texto.delete! '^r'
texto
#=> "rrrr"
# Colocando o ^ antes de um caractere, será interpretado que não é para remover esse caractere.
# Removendo o caractere -
texto = 'O-rato-roeu-a-roupa-do-rei-de-Roma.'
texto.delete! '\-'
texto
#=> "OratoroeuaroupadoreideRoma."
# Colocando o \ antes de um caractere, como circunflexo, hífen ou outra barra invertida, atua como escape.
Não sei se ficou boa a explicação, mas espero que você tenha entendido.
Saiba que isso é aplicado somente aos métodos: count
, delete
, tr
, tr_s
e squeeze
. Qualquer dúvida, pesquise na documentação para saber mais.
Faltam mais cinco métodos para acabar com esse subcapítulo.
Vamos supor uma situação em que um usuário registrou um material, mas o nome do material está estranho. Por exemplo:
" Parafuso Allen Inox M8 X 20 "
Sabe qual seria o problema? Tem espaço em branco no começo e no final do nome do material, e convenhamos que isso não será agradável quando visualizar o nome, se não for tratado.
Então, antes de registrar o material no banco de dados, vamos tratá-lo.
material = ' Parafuso Allen Inox M8 X 20 '
material.strip!
material
#=> "Parafuso Allen Inox M8 X 20"
Mas não é só isso, temos também dois métodos parecidos com strip
, que são lstrip
e rstrip
. Vamos ver um exemplo.
# Remove espaços em branco do começo
material = ' Parafuso Allen Inox M8 X 20'
material.lstrip!
material
#=> "Parafuso Allen Inox M8 X 20"
# Remove espaços em branco do final
material = 'Parafuso Allen Inox M8 X 20 '
material.rstrip!
material
#=> "Parafuso Allen Inox M8 X 20"
Certo, vamos cortar!
Sinceramente, um outro método que considero inútil, veja você mesmo.
"abc\r\n".chop!
#=> "abc"
"abcdd".chop!
#=> "abcd"
"abcd".chop!
#=> "abc"
Eu não consigo pensar em que situação você usaria esse método. Você teria que ter uma condição para o caso de querer remover o \r\n
, senão ele vai cortar o último caractere.
O que seria útil é o método chomp
, que é a mesma coisa que o chop
, porém você pode passar um argumento para especificar o que deseja que ele remova no final da string.
# Por padrão, ele remove os caracteres \n, \r ou \r\n do final da string.
"abc\r".chomp!
#=> "abc"
"abc\n".chomp!
#=> "abc"
"abc\r\n".chomp!
#=> "abc"
"abc\n\r".chomp!
#=> "abc\n"
# Quando o argumento é '', ele removerá todas as ocorrências de \n ou \r\n.
"abc\n\n\n".chomp!('')
#=> "abc"
"abc\r\n\r\n\r\n".chomp!('')
#=> "abc"
"abc\n\n\r\n\r\n\n\n".chomp!('')
#=> "abc"
"abc\n\r\n\r\n\r".chomp!('')
#=> "abc\n\r\n\r\n\r"
"abc\r\r\r".chomp!('')
#=> "abc\r\r\r"
# Quando o argumento não for `\n` ou `''`, ele removerá o caractere que foi passado.
'abcd'.chomp('d')
#=> "abc"
'abcdd'.chomp('d')
#=> "abcd"
Certo, terminamos a parte de deleção. Mas antes disso, vou mostrar a lista de métodos que possuem !
.
-
slice
=>slice!
-
squeeze
=>squeeze!
-
delete
=>delete!
-
lstrip
=>rstrip!
-
rstrip
=>rstrip!
-
strip
=>strip!
-
chomp
=>chomp!
-
chop
=>chop!
Iterando
Bem, tem seis métodos para fazer iteração, mas só vou abordar dois, pois não estou afim de explicar o resto.
Temos o método each_char
que itera letra por letra.
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-.-
Temos o método each_line
que itera linha por linha
texto = "Sou \no \nmestre \ndo \nmeu \nmar."
texto.each_line { |l| print l }
#Sou
#o
#mestre
#do
#meu
#mar.
Pronto, é só isso. Mas eu mostrarei a lista dos métodos que não foram abordados.
each_byte
each_codepoint
each_grapheme_cluster
upto
Convertendo em Uma Nova String
Sabe aqueles métodos que têm o !
? Então, você deve ter visto esses métodos também sem o !
. Isso acontece porque, em vez de modificar a string original, eles retornam uma nova string.
Como já abordei os métodos que têm a versão com !
, não vou mostrar novamente aqueles que têm a versão sem o !
. Vou apenas apresentar outros métodos que não têm o !
.
Extensão
Quando estamos falando de extensão, estamos falando de estender a string.
Vamos com um clássico.
nome = 'Alexandre' + ' ' + 'dos' + ' ' + 'Santos' + ' ' + 'Alves'
nome
#=> "Alexandre dos Santos Alves"
Nada demais, vamos para outro método que é parecido. Só que este método modifica a string original.
nome = 'Alexandre'
nome.concat(' ', 'dos', ' ', 'Santos', ' ', 'Alves')
nome
#=> "Alexandre dos Santos Alves"
Certo, mas qual é a diferença? Bem, descubra você mesmo.
Agora, vamos para outro método que é parecido com concat
, só que ele concatena no começo da string.
nome = 'o Grande.'
nome.prepend 'Alexandre, '
#=> "Alexandre, o Grande."
Eu sei que não sou o único que faz isso, mas você já fez uma linha para melhorar a visualização dos dados que estão sendo exibidos no terminal quando tem muita informação?
# O que eu geralmente faço em outra linguagem.
puts '=================================================='
puts 'Informação'
puts '=================================================='
#==================================================
#Informação
#==================================================
# O que faço no Ruby.
puts '=' * 50
puts 'Informação'
puts '=' * 50
#==================================================
#Informação
#==================================================
Certo, agora vamos supor que queira centralizar o texto no terminal, como posso fazer isso?
É só usar o método center
.
puts '=' * 50
puts 'Informação'.center 50
puts '=' * 50
#==================================================
# Informação
#==================================================
O método center
aceita dois argumentos, o primeiro argumento é o tamanho e o segundo é o que você deseja preencher nesse espaço criado.
Por padrão, o segundo argumento é um espaço em branco. Vamos ver mais um exemplo.
puts '=' * 50
puts 'Informação'.center(50, '-')
puts '=' * 50
#==================================================
#--------------------Informação--------------------
#==================================================
O que acontece quando o tamanho é menor que o da string? Bem, nada. A centralização só vai acontecer se o tamanho for maior que o da string.
puts 'Informação'.center(5, '-')
#Informação
Mas eu quero deixá-lo à direita. Existe um método para isso? Sim! É a mesma coisa que o center
, o método aceita os dois argumentos.
puts '=' * 50
puts 'Informação'.rjust 50
puts '=' * 50
#==================================================
# Informação
#==================================================
puts '=' * 50
puts 'Informação'.rjust(50, '-')
puts '=' * 50
#==================================================
#----------------------------------------Informação
#==================================================
Também tem a de esquerda.
puts '=' * 50
puts 'Informação'.ljust 50
puts '=' * 50
#==================================================
#Informação
#==================================================
puts '=' * 50
puts 'Informação'.ljust(50, '-')
puts '=' * 50
#==================================================
#Informação----------------------------------------
#==================================================
Convertendo Uma String em Uma Não-String
Como assim uma não-string?
Bem, como o nome sugere, é qualquer objeto que não seja uma String
, como Integer
, Float
, Array
etc.
Vamos começando convertendo uma String
em Array
.
Como este artigo já está ficando grande e os métodos que vou apresentar são bem fáceis de entender, vou apresentar todos os métodos de uma vez.
# Retorna um array de caracteres.
'Alexandre'.chars
#=> ["A", "l", "e", "x", "a", "n", "d", "r", "e"]
# Retorna um array de bytes.
'Alexandre'.bytes
#=> [65, 108, 101, 120, 97, 110, 100, 114, 101]
# Retorna um array de palavras de acordo com o delimitador.
# O método split pode receber dois argumentos: o primeiro é o
# delimitador e o segundo é o limite do tamanho do array.
# Por padrão, o delimitador é um espaço em branco.
'Não posso controlar minha mente.'.split
#=> ["Não", "posso", "controlar", "minha", "mente."]
'Não-posso-controlar-minha-mente.'.split
#=> ["Não-posso-controlar-minha-mente."]
'Não-posso-controlar-minha-mente.'.split '-'
#=> ["Não", "posso", "controlar", "minha", "mente."]
'Não-posso-controlar-minha-mente.'.split('-', 3)
#=> ["Não", "posso", "controlar-minha-mente."]
# Retorna um array de linhas de acordo com o delimitador.
# Por padrão, o delimitador é \n
"Os espinhos a protegem\nPois não quer mais ser ferida".lines
#=> ["Os espinhos a protegem\n", "Pois não quer mais ser ferida"]
# Percebeu que ele não removeu o \n? Para remover isso, basta fazer isso.
"Os espinhos a protegem\nPois não quer mais ser ferida".lines(chomp: true)
#=> ["Os espinhos a protegem ", "Pois não quer mais ser ferida"]
# Vamos supor que você queira separar por ---
"Os espinhos a protegem---Pois não quer mais ser ferida".lines('---', chomp: true)
#=> ["Os espinhos a protegem", "Pois não quer mais ser ferida"]
# Agora vamos converter a string em número
# Inteiro
'102'.to_i
#=> 102
'102.92'.to_i
#=> 102
# Float
'102'.to_f
#=> 102.0
'102.92'.to_f
#=> 102.92
Finalmente!!! Terminamos!!!
Aqui está a lista de métodos que não foram abordados:
codepoints
getbyte
grapheme_clusters
partition
rpartition
scan
unpack
unpack1
hex
oct
ord
inspect
to_sym
intern
Conclusão
Certo, eu sei que não abordei todos os métodos, pois não consegui pensar em uma forma de explicar isso de forma simplificada.
Bem, já estou cansado. Vou terminar por aqui. Então, tchau!
Top comments (0)