Ruby Language
Smyczki
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:
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 "