Szukaj…


Składnia

  • „Ciąg” // tworzy ciąg za pomocą literału pojedynczego
  • „Ciąg” // tworzy ciąg za pomocą literału podwójnego cudzysłowu
  • String.new („Ciąg znaków”)
  • % q (ciąg znaków) // alternatywna składnia do tworzenia ciągów pojedynczych cudzysłowów
  • % Q (ciąg znaków) // alternatywna składnia do tworzenia ciągów cudzysłowów

Różnica między literałami ciągowymi jedno- i dwu-cytowanymi

Główną różnicą jest to, że cudzysłowy String literalnych obsługują interpolacje ciągów oraz pełny zestaw sekwencji specjalnych.

Mogą na przykład zawierać dowolne wyrażenia Rubiego za pomocą interpolacji:

# Single-quoted strings don't support interpolation
puts 'Now is #{Time.now}'
# Now is #{Time.now}

# Double-quoted strings support interpolation
puts "Now is #{Time.now}"
# Now is 2016-07-21 12:43:04 +0200

Ciągi cudzysłowowe obsługują również cały zestaw sekwencji specjalnych, w tym "\n" , "\t" ...

puts 'Hello\nWorld'
# Hello\nWorld

puts "Hello\nWorld"
# Hello
# World

... podczas gdy ciągi pojedynczego cudzysłowu nie obsługują sekwencji specjalnych, odznaczając minimalny zestaw niezbędny do wykorzystania ciągów pojedynczych: dosłowne pojedyncze cudzysłowy i ukośniki odwrotne, odpowiednio '\'' i '\\' .

Tworzenie łańcucha

Ruby oferuje kilka sposobów tworzenia obiektu String . Najczęstszym sposobem jest użycie pojedynczych lub podwójnych cudzysłowów w celu utworzenia „ literału ciągu ”:

s1 = 'Hello'
s2 = "Hello"

Główną różnicą jest to, że cudzysłowy ciągów literalnych są nieco bardziej elastyczne, ponieważ obsługują interpolację i niektóre sekwencje specjalne odwrotnego ukośnika.

Istnieje również kilka innych możliwych sposobów tworzenia literału ciągu przy użyciu dowolnych ograniczników ciągu. Dowolny separator ciągu to % po którym następuje pasująca para separatorów:

%(A string)
%{A string}
%<A string>
%|A string|
%!A string!

Wreszcie, można użyć %q i %Q sekwencji, które są równoznaczne z ' i " „:

puts %q(A string)
# A string
puts %q(Now is #{Time.now})
# Now is #{Time.now}

puts %Q(A string)
# A string
puts %Q(Now is #{Time.now})
# Now is 2016-07-21 12:47:45 +0200

Sekwencje %q i %Q są przydatne, gdy ciąg zawiera albo pojedyncze cudzysłowy, podwójne cudzysłowy, albo kombinację obu. W ten sposób nie musisz uciekać z zawartości:

%Q(<a href="/profile">User's profile<a>)

Możesz użyć kilku różnych ograniczników, o ile istnieje pasująca para:

%q(A string)
%q{A string}
%q<A string>
%q|A string|
%q!A string!

Łączenie ciągów

Połącz łańcuchy z operatorem + :

s1 = "Hello"
s2 = " "
s3 = "World"

puts s1 + s2 + s3
# => Hello World

s = s1 + s2 + s3
puts s
# => Hello World

Lub z operatorem << :

s = 'Hello'
s << ' '
s << 'World'
puts s
# => Hello World

Zauważ, że operator << modyfikuje obiekt po lewej stronie.

Możesz także pomnożyć ciągi znaków, np

"wow" * 3
# => "wowwowwow"

Interpolacja ciągów

Podwójny cudzysłów " i sekwencja %Q obsługuje interpolację ciągów za pomocą #{ruby_expression} :

puts "Now is #{Time.now}"
# Now is Now is 2016-07-21 12:47:45 +0200

puts %Q(Now is #{Time.now})
# Now is Now is 2016-07-21 12:47:45 +0200

Manipulacja sprawami

"string".upcase     # => "STRING"
"STRING".downcase   # => "string"
"String".swapcase   # => "sTRING"
"string".capitalize # => "String"

Te cztery metody nie modyfikują oryginalnego odbiornika. Na przykład,

str = "Hello"
str.upcase # => "HELLO"
puts str   # => "Hello"

Istnieją cztery podobne metody, które wykonują te same czynności, ale modyfikują oryginalny odbiornik.

"string".upcase!     # => "STRING"
"STRING".downcase!   # => "string"
"String".swapcase!   # => "sTRING"
"string".capitalize! # => "String"

Na przykład,

str = "Hello"
str.upcase!  # => "HELLO"
puts str     # => "HELLO"

Uwagi:

  • przed Ruby 2.4 metody te nie obsługują Unicode.

Podział łańcucha

String#split dzieli String na Array na podstawie ogranicznika.

"alpha,beta".split(",")
# => ["alpha", "beta"]

Pusty String powoduje powstanie pustej Array :

"".split(",")
# => []

Niepasujący separator powoduje, że Array zawiera pojedynczy element:

"alpha,beta".split(".")
# => ["alpha,beta"]

Możesz także podzielić ciąg znaków, używając wyrażeń regularnych:

"alpha, beta,gamma".split(/, ?/)
# => ["alpha", "beta", "gamma"]

Separator jest opcjonalny, domyślnie łańcuch jest dzielony na białe znaki:

"alpha beta".split
# => ["alpha", "beta"] 

Łączenie strun

Array#join łączy Array w String , w oparciu o ogranicznik:

["alpha", "beta"].join(",")
# => "alpha,beta"

Separator jest opcjonalny i domyślnie jest pusty String .

["alpha", "beta"].join
# => "alphabeta"

Pusta Array skutkuje pustym String , bez względu na to, który separator jest używany.

[].join(",")
# => ""

Ciągi wielowierszowe

Najłatwiejszym sposobem utworzenia ciągu wielowierszowego jest po prostu użycie wielu wierszy między znakami cudzysłowu:

address = "Four score and seven years ago our fathers brought forth on this
continent, a new nation, conceived in Liberty, and dedicated to the
proposition that all men are created equal."

Głównym problemem związanym z tą techniką jest to, że jeśli ciąg zawiera cytat, przerwie jego składnię. Aby obejść ten problem, możesz zamiast tego użyć heredoc :

puts <<-RAVEN
  Once upon a midnight dreary, while I pondered, weak and weary, 
  Over many a quaint and curious volume of forgotten lore— 
      While I nodded, nearly napping, suddenly there came a tapping, 
  As of some one gently rapping, rapping at my chamber door. 
  "'Tis some visitor," I muttered, "tapping at my chamber door— 
              Only this and nothing more." 
  RAVEN

Ruby obsługuje tutaj dokumenty w stylu powłoki za pomocą <<EOT , ale tekst kończący musi zaczynać linię. To zepsuło wcięcia kodu, więc nie ma wiele powodów, aby używać tego stylu. Niestety ciąg będzie miał wcięcia zależne od tego, w jaki sposób wcięty jest sam kod.

Ruby 2.3 rozwiązuje problem, wprowadzając <<~ który usuwa nadmiarowe spacje wiodące:

2.3
def build_email(address)
  return (<<~EMAIL)
    TO: #{address}

    To Whom It May Concern:

    Please stop playing the bagpipes at sunrise!
                     
    Regards,
    Your neighbor               
  EMAIL
end

Ciągi procentowe działają również w celu tworzenia ciągów wielowierszowych:

%q(
HAMLET        Do you see yonder cloud that's almost in shape of a camel?
POLONIUS        By the mass, and 'tis like a camel, indeed.
HAMLET        Methinks it is like a weasel.
POLONIUS        It is backed like a weasel.
HAMLET        Or like a whale?
POLONIUS        Very like a whale
)

Istnieje kilka sposobów uniknięcia interpolacji i sekwencji ucieczki:

  • Pojedynczy cytat zamiast podwójnego: '\n is a carriage return.'

  • Małe litery q w ciągu procentowym: %q[#{not-a-variable}]

  • Cytuj pojedynczy ciąg terminala w heredoc:

    <<-'CODE'
       puts 'Hello world!'
    CODE
    

Sformatowane ciągi

Ruby może wstrzyknąć tablicę wartości do łańcucha, zastępując dowolne symbole zastępcze wartościami z dostarczonej tablicy.

"Hello %s, my name is %s!" % ['World', 'br3nt']
# => Hello World, my name is br3nt!

['Hello', 'br3nt'] są reprezentowane przez dwa %s wartości są dostarczane przez tablicę ['Hello', 'br3nt'] . Operator % instruuje ciąg, aby wstrzyknął wartości z tablicy.

Zastępowanie znaków ciągu

Metoda tr zwraca kopię ciągu znaków, w którym znaki pierwszego argumentu są zastępowane znakami drugiego argumentu.

"string".tr('r', 'l') # => "stling"

Aby zastąpić tylko pierwsze wystąpienie wzorca innym wyrażeniem, użyj metody sub

"string ring".sub('r', 'l') # => "stling ring"

Jeśli chcesz zastąpić wszystkie wystąpienia wzorca tym wyrażeniem, użyj gsub

"string ring".gsub('r','l') # => "stling ling" 

Aby usunąć znaki, podaj pusty ciąg dla drugiego parametru

Możesz również używać wyrażeń regularnych we wszystkich tych metodach.

Ważne jest, aby pamiętać, że te metody zwrócą tylko nową kopię ciągu i nie zmodyfikują go w miejscu. Aby to zrobić, musisz użyć tr! , sub! i gsub! metody odpowiednio.

Zrozumienie danych w ciągu

W Ruby ciąg jest po prostu sekwencją bajtów wraz z nazwą kodowania (np. UTF-8 , US-ASCII , ASCII-8BIT ), która określa, w jaki sposób możesz interpretować te bajty jako znaki.

Ciągów ruby można używać do przechowywania tekstu (w zasadzie sekwencji znaków), w którym to przypadku zwykle stosuje się kodowanie UTF-8.

"abc".bytes  # => [97, 98, 99]
"abc".encoding.name  # => "UTF-8"

Ciągów ruby można również używać do przechowywania danych binarnych (sekwencji bajtów), w którym to przypadku zwykle stosuje się kodowanie ASCII-8BIT.

[42].pack("i").encoding  # => "ASCII-8BIT"

Możliwe jest, że sekwencja bajtów w ciągu nie będzie pasować do kodowania, co spowoduje błędy przy próbie użycia ciągu.

"\xFF \xFF".valid_encoding? # => false
"\xFF \xFF".split(' ')      # ArgumentError: invalid byte sequence in UTF-8

Zastępowanie ciągów

p "This is %s" % "foo"
# => "This is foo"

p "%s %s %s" % ["foo", "bar", "baz"]
# => "foo bar baz"

p "%{foo} == %{foo}" % {:foo => "foo" }
# => "foo == foo"

Zobacz String % docs i Kernel :: sprintf, aby uzyskać więcej informacji.

Ciąg zaczyna się od

Aby sprawdzić, czy ciąg zaczyna się od wzoru, start_with? metoda jest przydatna

str = "zebras are cool"
str.start_with?("zebras")      => true

Możesz również sprawdzić pozycję wzoru za pomocą index

str = "zebras are cool"
str.index("zebras").zero?      => true

Łańcuch kończy się na

Aby sprawdzić, czy ciąg znaków kończy się wzorcem, end_with? metoda jest przydatna

str = "I like pineapples"
str.end_with?("pineaaples")      => false

Sznurki pozycjonujące

W Ruby ciągi mogą być wyrównane do lewej, wyrównane do prawej lub wyśrodkowane

Aby wyjustować lewy ciąg, użyj metody ljust . Przyjmuje to dwa parametry, liczbę całkowitą reprezentującą liczbę znaków nowego ciągu oraz ciąg reprezentujący wzór do wypełnienia.

Jeśli liczba całkowita jest większa niż długość oryginalnego ciągu, nowy ciąg zostanie wyjustowany do lewej, a opcjonalny parametr ciągu zajmie pozostałe miejsce. Jeśli parametr ciągu nie zostanie podany, ciąg zostanie wypełniony spacjami.

str ="abcd"
str.ljust(4)          => "abcd"
str.ljust(10)         => "abcd      "

Aby wyjustować ciąg do prawej, użyj metody rjust . Przyjmuje to dwa parametry, liczbę całkowitą reprezentującą liczbę znaków nowego ciągu oraz ciąg reprezentujący wzór do wypełnienia.

Jeśli liczba całkowita jest większa niż długość oryginalnego ciągu, nowy ciąg zostanie wyjustowany do prawej, a opcjonalny parametr ciągu zajmie pozostałe miejsce. Jeśli parametr ciągu nie zostanie podany, ciąg zostanie wypełniony spacjami.

str = "abcd"
str.rjust(4)          => "abcd"
str.rjust(10)         => "      abcd"

Aby wyśrodkować ciąg, użyj metody center . Przyjmuje to dwa parametry, liczbę całkowitą reprezentującą szerokość nowego łańcucha i łańcuch, którym zostanie uzupełniony oryginalny łańcuch. Ciąg zostanie wyrównany do środka.

str = "abcd"
str.center(4)          => "abcd"
str.center(10)         => "   abcd   "


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow