Tipos básicos no Ruby
01/08/09
Alguns dos tipos básicos do Ruby possuem atalhos para definir valores como strings e arrays, por exemplo. Uma coisa muita gente não sabe, é a diferença entre os diversos tipos de atalhos, como você poderá conferir abaixo.
Strings
Existem cinco maneiras diferentes de se definir uma string no Ruby.
string = "Ruby is awesome!"
string = 'Ruby is awesome!'
string = %q(Ruby is awesome!)
string = %Q(Ruby is awesome!)
string = <<-TXT
Ruby is awesome!
TXT
O que difere uma das outras é a capacidade de se interpolar código Ruby na string.
lang = "Ruby"
puts "#{lang} is awesome!"
# => Ruby is awesome!
puts '#{lang} is awesome!'
# => #{lang} is awesome!
puts %Q(#{lang} is awesome!)
# => Ruby is awesome!
puts %q(#{lang} is awesome!)
# => #{lang} is awesome!
puts <<-TXT
#{lang} is awesome!
TXT
# => Ruby is awesome!
Arrays
O Array também possui formas diferentes de instanciação.
items = ["Ruby", "is", "awesome!"]
items = %w(Ruby is awesome!)
items = %W(Ruby is awesome!)
E de forma similar, a diferença entre as duas últimas formas é a interpolação de código Ruby.
lang = "Ruby"
items = %w(#{lang} is awesome!)
# => ["\#{lang}", "is", "awesome!"]
items = %W(#{lang} is awesome!)
# => ["Ruby", "is", "awesome!"]
Expressões regulares
Expressões regulares podem ser definidas de três formas diferentes.
regex = /ruby/sim
regex = %r(ruby)sim
regex = Regexp.new("ruby", Regexp::MULTILINE|Regexp::IGNORECASE|Regexp::EXTENDED)
Não existem diferenças na execução das expressões regulares; na prática, se sua expressão possui muitas aspas, é interessante usar o atalho %r().
Comandos Shell
A execução de comandos Shell pode ser feita de três maneiras diferentes.
`pwd`
%x(pwd)
system "pwd"
A única diferença prática é que o método system irá enviar o resultado para STDOUT, enquanto %x(pwd) e `pwd` irão retornar a resposta da execução.
- Permalink
- Trackback
- Comentários (6)
- Ao som de: AFI – The Interview
Textos escritos por
Comentários #
Existe um esquema com o operador % que pode ser usado para declarar strings, eu ainda não consegui descobrir como ele funciona realmente, mas a primeira vez que vi isso foi no código do ActiveRecord, um exemplo:
string = %@Foo bar@ # => "Foo bar"
string = %$Foo bar$ # => "Foo bar"
string = %_Foo bar_ # => "Foo bar"
Para os três casos o resultado é o mesmo, e inclusive pode ser usado com outros operadores, como (), &&, **, e por ai vai.
Eu tenho usado ele como uma forma alternativa ao <<-TXT, podendo escrever strings assim:
string = %@
Hello
Foo Bar
@
Ótimo post.
Uma dica: no Ruby 1.9, você provavelmente irá cair num erro "Encoding::CompatibilityError: incompatible encoding regexp match (Windows-31J regexp with UTF-8 string)" se usar o modificador s nas expressões regulares (por exemplo: /ruby/sim)
Não achei ainda uma documentação oficial sobre isso mas, no 1.9, o s configura a Regexp pra fazer o matching usando o encoding Windows-31J. Dessa forma, se a string na qual você está aplicando a expressão regular estiver num encoding incompatível com esse (como UTF-8), vai dar pau. Tivemos alguns problemas relacionados a isso na sanitização de feeds pro http://busk.com
Exemplo: http://pastie.org/568326
Éverton,
Quando você vai declarar uma string, você não precisa usar parenteses ou chaves necessariamente (
%(Foo)ou%{Foo}). Você pode usar qualquer caracter, como nos exemplos que você passou (%@Foo@e demais).Quanto à sua substituição do HEREDOC: o que você está fazendo é simplesmente criar uma string multilinhas como com o atalho. ;)
Retificando:
Na verdade, desde versões anteriores, o s configura encoding. Mas o 1.8 "deixa passar" e o 1.9 é "chato" com encoding (ainda bem).
Para usar o mode estendido a flag é x.
Referência: http://www.zenspider.com/Languages/Ruby/QuickRef.html#11
s = 'mais uma ' 'maneira' => "mais uma maneira"
s = String.new("Maneira javesca") #=> "Maneira javesca"
s = %q| pode usar pipe | => " pode usar pipe "
s = %q[ pode usar outros tokens] => " pode usar outros tokens"
s = %| ou apenas % | => " ou apenas % "
#Array
in_line = :foo, 34, :bar, 3000 #=> [:foo, 34, :bar, 3000]
a = Array['verbosada',2,3,4] #=> ["verbosada", 2, 3, 4]
com_fill = Array.new(5){|i| i**2 } #=> [0, 1, 4, 9, 16]
a,*b = 1,3,6 #=> a => 1 e b => [3, 6]
and Full Java Style
Array a = Array.new
String s = String.new
Deixe um comentário