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?


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.


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ę


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?"

Czy w Rubim nawiasy kwadratowe oznaczają krotkę? Myślałem, że nawiasy kwadratowe to listy ...
TIMEX


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"]
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.