Jaki jest odpowiednik polecenia `s =“ hello,% s w Rubim. Gdzie jest% s? ” % („Jan”, „Mary”) „

141

W Pythonie ten idiom dla formatowania ciągów jest dość powszechny

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

Jaki jest odpowiednik w Rubim?

TIMEX
źródło
3
Nie ma konkatenacji ciągów, tylko formatowanie ciągów. A Google odpowie na to szybciej, niż mógłby kiedykolwiek zrobić ... zajęło mi około 20 sekund, aby dowiedzieć się, że możesz zrobić dokładnie to samo w Rubim.
Nie prosisz o konkatenację, tylko o formatowanie / podstawianie. Powinieneś zmienić swoje pytanie. Nawiasem mówiąc, w ruby, konkatenacja jest wykonywana za pomocą operatorów + lub <<.
David

Odpowiedzi:

246

Najłatwiejszym sposobem jest interpolacja ciągów . Możesz wstrzykiwać małe fragmenty kodu Ruby bezpośrednio do swoich łańcuchów.

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

W Rubim możesz także tworzyć łańcuchy formatujące.

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

Pamiętaj, aby użyć tam nawiasów kwadratowych. Ruby nie ma krotek, tylko tablice, a te używają nawiasów kwadratowych.

O Ruby
źródło
1
Zdecydowanie skorzystałbym z pierwszego, wydaje mi się bardziej czytelny
David
1
Pierwsza nie zadziała, # {} szuka zmiennej, więc w tym przypadku wypisuje zmienną John, a nie ciąg „John”. Drugi wygląda poprawnie.
Jason Noble
11
Należy również uważać, aby zawsze używać cudzysłowów, ponieważ '#{name1}'to nie to samo co "#{name1}".
Droogans,
3
Interpolacja ciągów nie działa w apostrofach, należy używać cudzysłowów podwójnych. Na przykład: '#{"abc"}' # => "\#{\"abc\"}"ale to, czego chcesz, to"#{"abc"}" # => "abc"
bschlueter
2
Pierwszy sposób nie jest odpowiednikiem - szablon nie może być przekazywany jako wartość.
Ondra Žižka
51

W Ruby> 1.9 możesz to zrobić:

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

Zobacz dokumentację

toong
źródło
Edytowałem w odpowiedniku Idomatic Ruby tam - ale teraz zauważam, że zaakceptowana odpowiedź już to robi - ponownie usunąłem 'edycję': - /
toong
W przypadku użycia skrótu z operatorem ciągu%, jeśli symbol klucza, do którego odwołuje się ciąg formatu, nie jest obecny, otrzymasz KeyError.
user1164178
19

Prawie w ten sam sposób:

irb(main):003:0> "hello, %s. Where is %s?" % ["John","Mary"]
=> "hello, John. Where is Mary?"
Manoj Govindan
źródło
Czy w Rubim nawiasy kwadratowe oznaczają krotkę? Myślałem, że nawiasy kwadratowe to listy ...
TIMEX
@TIMEX: To pytanie pomoże: stackoverflow.com/questions/525957/tuples-in-ruby
Manoj Govindan
3
Ruby nie ma krotek (przynajmniej nie wrobionych w język). Tak, to tablica („lista” w Pythonie powinna naprawdę nazywać się tablicami ...).
9

Właściwie prawie to samo

s = "hello, %s. Where is %s?" % ["John","Mary"]
phadej
źródło