Fala galera, beleza? Estamos novamente de volta aos estudos de Ruby que dessa vez englobará o tipo Texto.
Os Textos em Ruby são representados através de objetos mutáveis da classe String, que possui vários métodos e operadores para inserir, deletar, repor, etc. Geralmente, as patterns respectivas a classe Text são representadas por expressões regulares , sendo uma característica forte no Ruby, que as usa quase que literalmente. Porém, não mais usadas do que outros tipos de dados como os números, strings e array são.
String Literais com aspas simples
São marcadas através do apóstrofo ‘Isso é uma string literal’ . Caso deseje acrescentar uma aspas simples dentro de uma String, basta utilizar um contrabarra:
1
|
'Ruby é 'simples' né? '
|
E caso necessite de utilizar a contrabarra em meio a uma string literal, faça:
1
|
' Isso é uma contra barra \'
|
' Isso é uma contra barra \'
ou
String Literais com aspas duplas
Ao contrário das com aspas simples, essas Strings são muito mais flexíveis, pois permitem mais seqüencias de interação como o “n”, por exemplo, que permite a quebra de linha , e para aqueles que já estiverem familiarizados com a linguagem C vai ficar bem mais fácil de entender.
O funcionamento das strings com aspas duplas no Ruby é bem simples: Ela é criada, a expressão é averiguada, convertida para uma String e então colocada em seu devido lugar como uma expressão textual. Isso é conhecido como “interpolação de strings”, onde uma string de aspas duplas pode ter uma outra expressão que inicie com o caracter # e as obtenha as chaves { }. Só para visualizar essa interpolação, vejamos o seguinte exemplo onde
1
|
$salutation = 'hello' "#$salutation world" # retorna "hello world"
|
$salutation = 'hello' "#$salutation world" # retorna "hello world"
Estamos passando uma variável global como expressão para uma string e ela interpreta normalmente. Se você está habituado ao C, não terá problemas em entender o conceito.
Engraçado foi que ao ver em alguns códigos, perebi que o Ruby permite a utilização do printf ou sprintd, o que ajuda ainda mais na interpolação , por exemplo:
1
|
sprintf("o valor de PI esta em torno de: %.4f", Math::PI) # "O valor de Pi esta em torno de: 3.1416"
|
sprintf("o valor de PI esta em torno de: %.4f", Math::PI) # "O valor de Pi esta em torno de: 3.1416"
Bacana, certo?
Here Documents
O Here Document é uma maneira de expressar uma string literal em linhas de comando shell. Ele preserva as quebras de linha e espaços em branco (até mesmo a indentação) no texto. Existem algumas linguagens que permitem até mesmo a substituição de variável e substituição de comando dentro da string.
Eles incia geralmente com << ou <<- . O texto de uma string literal começa na linha seguinte, pelo texto a ser citado, e depois fechada pelo mesmo identificador em sua própria linha. Exemplo:
1
2
3
4
5
6
|
ruby-1.9.2-p136 :007 > heredoc = <<TEXTO
ruby-1.9.2-p136 :008"> texto pro blog
ruby-1.9.2-p136 :009"> here documents
ruby-1.9.2-p136 :010">
ruby-1.9.2-p136 :011"> TEXTO
=> "texto pro blognhere documentsn:)n"
|
ruby-1.9.2-p136 :007 > heredoc = <<TEXTO
ruby-1.9.2-p136 :008"> texto pro blog
ruby-1.9.2-p136 :009"> here documents
ruby-1.9.2-p136 :010">
ruby-1.9.2-p136 :011"> TEXTO
=> "texto pro blognhere documentsn:)n"
O interpretador do Ruby capta o conteúdo de uma string literal lendo linha por linha de acordo com sua inserção. Na realidade, após entender que o conteúdo é um here document, o interpretador volta na última linha que foi inserida e continua com o parse.
Só para adiantar, você usará bastante no Rails.. Uma vez que você consegue fazer isso:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
htmlDocument = <<-"# # #"
<html><head><title>#{title}</title></head>
<body>
<h1>#{title}</h1>
#{body}
</body>
</html>
# # #
|
htmlDocument = <<-"# # #"
<html><head><title>#{title}</title></head>
<body>
<h1>#{title}</h1>
#{body}
</body>
</html>
# # #
Mutabilidade e as Strings literais
No Ruby, o interpretador não consegue usar um mesmo objeto para representar duas strings literais idênticas, pois cada vez que o interpretador encontra uma string literal, ele cria um novo objeto. Só para ilustrar o que falo, vejamos esse laço de repetição:
1
2
3
4
5
6
7
8
9
10
11
12
|
ruby-1.9.2-p136 :044 > 10.times { puts "abc".object_id }
2177866260
2177866220
2177866180
2177866080
2177865980
2177865940
2177865900
2177865860
2177865820
2177865780
=> 10
|
ruby-1.9.2-p136 :044 > 10.times { puts "abc".object_id }
2177866260
2177866220
2177866180
2177866080
2177865980
2177865940
2177865900
2177865860
2177865820
2177865780
=> 10
Observa que cada iteração de “abc” possui uma id diferente? Então, se você incluir uma string literal em um laço de repetição, o Ruby vai criar um objeto para cada iteração. Portanto, é bom evitar o uso excessivo de string literais.
Caracteres literais
Os caracteres podem ser expressos em Ruby inserindo um ponto de interrogação antes, por exemplo:
1
2
|
ruby-1.9.2-p136 :050 > ?A
=> "A"
|
ruby-1.9.2-p136 :050 > ?A
=> "A"
Apesar do Ruby possuir uma sintaxe para caracteres literais ele não possui uma classe especifica para representar caracteres. Ao invés disso, os caracteres literais são tidos como uma string de tamanho 1.
Operações com Strings
A classe String do Ruby fornece uma série de operadores para tratar as strings. Para fazer uma operação simples de concatenação, basta adicionar um “+”:
1
2
3
4
|
ruby-1.9.2-p136 :051 > nome = "Uriel"
=> "Uriel"
ruby-1.9.2-p136 :052 > nome + " Juliatti"
=> "Uriel Juliatti"
|
ruby-1.9.2-p136 :051 > nome = "Uriel"
=> "Uriel"
ruby-1.9.2-p136 :052 > nome + " Juliatti"
=> "Uriel Juliatti"
Muito simples. Assim como o “+”, o operador << também trabalha bastante no Ruby, porém deve-se tomar cuidado, pois se você der um append com um número, o Ruby entende que é um caracter (ASCII).
1
2
3
4
|
ruby-1.9.2-p136 :055 > alfabeto = "A"
=> "A"
ruby-1.9.2-p136 :056 > alfabeto << 67
=> "AC"
|
ruby-1.9.2-p136 :055 > alfabeto = "A"
=> "A"
ruby-1.9.2-p136 :056 > alfabeto << 67
=> "AC"
O operador * espera um inteiro após , portanto se você fizer:
1
2
|
ruby-1.9.2-p136 :057 > reticente = '.'*3
=> "..."
|
ruby-1.9.2-p136 :057 > reticente = '.'*3
=> "..."
É isso ai, tive que deixar o post bem direto e enxuto, portanto vou abordar um tema futuramente, que é o de Acessar caracteres e substrings. Mas o próximo post será sobre Arrays
Contudo, até a próxima e grande abraço a vocês!