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.

Comentários #

#1 Éverton Ribeiro disse:
01 Ago 09, 04:07PM

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
@

#2 Lucas Húngaro disse:
02 Ago 09, 12:50AM

Ó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

#3 Nando Vieira disse:
02 Ago 09, 12:50AM

É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. ;)

#4 Lucas Húngaro disse:
02 Ago 09, 12:56AM

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

#5 Shairon Toledo disse:
03 Ago 09, 10:24AM

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]

#6 Shairon Toledo disse:
03 Ago 09, 10:26AM

and Full Java Style

Array a = Array.new
String s = String.new

Deixe um comentário





Não é aceito código HTML: adicione-o no pastie.org ou paste.milk-it.net e poste apenas o link.

Se este é seu primeiro comentário, ele terá que ser aprovado antes de ser exibido.

jQuery: Dominando o framework

Você quer aprender a usar jQuery de verdade? Então chegou a hora! Neste workshop você verá como funciona este framework de JavaScript, entendendo todos os aspectos que fazem do jQuery uma das melhores ferramentas para desenvolvimento de interfaces.

Saiba mais Fechar

Conheça também o HOWTO