O que é o Ruby equivalente ao `s =“ olá,% s do Python? Onde está% s? ” % ("João", "Maria") `

141

Em Python, esse idioma para formatação de strings é bastante comum

s = "hello, %s. Where is %s?" % ("John","Mary")

Qual é o equivalente em Ruby?

TIMEX
fonte
3
Não há concatenação de strings, apenas formatação de strings. E o Google responderá isso mais rápido do que o SO jamais poderia ... levei cerca de 20 segundos para descobrir que você pode fazer exatamente o mesmo em Ruby.
Você não está pedindo concatenação, está pedindo formatação / substituição. Você deve mudar sua pergunta. A propósito, em ruby, a concatenação é realizada com operadores + ou <<.
David

Respostas:

246

A maneira mais fácil é a interpolação de strings . Você pode injetar pequenos pedaços de código Ruby diretamente em suas strings.

name1 = "John"
name2 = "Mary"
"hello, #{name1}.  Where is #{name2}?"

Você também pode formatar seqüências de caracteres no Ruby.

"hello, %s.  Where is %s?" % ["John", "Mary"]

Lembre-se de usar colchetes lá. O Ruby não possui tuplas, apenas matrizes e elas usam colchetes.

SobreRuby
fonte
1
Eu definitivamente utilizar o primeiro, que parece mais legível para mim
David
1
O primeiro não funcionará, o # {} procurará uma variável, portanto, neste caso, ele imprimiria a variável John, não a string "John". O segundo parece correto.
Jason Noble
11
Você também deve ter cuidado para sempre usar aspas duplas, pois '#{name1}'não é o mesmo que "#{name1}".
Droogans
3
A interpolação de sequência não funciona entre aspas simples, você deve usar aspas duplas. Por exemplo '#{"abc"}' # => "\#{\"abc\"}""#{"abc"}" # => "abc"
:,
2
A primeira maneira não é equivalente - o modelo não pode ser passado como um valor.
Ondra Žižka
51

Em Ruby> 1.9, você pode fazer isso:

s =  'hello, %{name1}. Where is %{name2}?' % { name1: 'John', name2: 'Mary' }

Veja os documentos

toong
fonte
Eu editei no equivalente Idomatic Ruby lá - mas agora percebo que a resposta aceita já faz isso - removi a 'edição' novamente: - /
toong
Ao usar um hash com o operador string%, se o símbolo da chave mencionado na string format não estiver presente, você obterá um KeyError.
user1164178
19

Quase da mesma maneira:

irb(main):003:0> "hello, %s. Where is %s?" % ["John","Mary"]
=> "hello, John. Where is Mary?"
Manoj Govindan
fonte
No Ruby, os colchetes significam uma tupla? Eu pensei que colchetes são listas ...
TIMEX
@TIMEX: Esta pergunta ajudará: stackoverflow.com/questions/525957/tuples-in-ruby
Manoj Govindan
3
Ruby não possui tuplas (pelo menos não forjadas no idioma). Sim, é uma matriz ("lista" em Python deve realmente ser chamada de matriz ...).
9

Na verdade quase o mesmo

s = "hello, %s. Where is %s?" % ["John","Mary"]
phadej
fonte