Spec-Zone.ru › Ruby 3.2

Литералы

Литералы создают объекты, которые можно использовать в вашей программе. Литералы включают:

  • Логические и Nil литералы

  • Числовые литералы

    • Целочисленные литералы

    • Вещественные литералы

    • Рациональные литералы

    • Комплексные литералы

  • Строковые литералы

  • Литералы документов Here

  • Символьные литералы

  • Массивы литералов

  • Хеш-литералы

  • Диапазонные литералы

  • Литералы регулярных выражений

  • Литералы Lambda Proc

  • Литералы с процентом

    • %q: Неинтерполируемые строковые литералы

    • % и %Q: Интерполируемые строковые литералы

    • %w и %W: Литералы массива строк

    • %i и %I: Литералы массива символов

    • %r: Литералы регулярных выражений

    • %s: Символьные литералы

    • %x: Литералы обратных кавычек

Логические и Nil литералы

nil и false — оба являются ложными значениями. nil иногда используется для обозначения «отсутствия значения» или «неизвестного», но оценивается как false в условных выражениях.

true является истинным значением. Все объекты, кроме nil и false, оцениваются как истинные значения в условных выражениях.

Числовые литералы

Целочисленные литералы

Целые числа любого размера можно записать следующим образом:

1234
1_234

Эти числа имеют одинаковое значение, 1234. Подчеркивание может использоваться для повышения читабельности для человека. Вы можете поместить подчеркивание где угодно в числе.

Вы можете использовать специальный префикс для записи чисел в десятичном, шестнадцатеричном, восьмеричном или двоичном формате. Для десятичных чисел используйте префикс 0d, для шестнадцатеричных чисел — префикс 0x, для восьмеричных чисел — префикс 0 или 0o, для двоичных чисел — префикс 0b. Буквенная часть числа нечувствительна к регистру.

Примеры:

0d170
0D170

0xaa
0xAa
0xAA
0Xaa
0XAa
0XaA

0252
0o252
0O252

0b10101010
0B10101010

Все эти числа имеют одинаковое десятичное значение, 170. Как и целые числа и числа с плавающей точкой, вы можете использовать подчеркивание для повышения удобочитаемости.

Вещественные литералы

Вещественные числа могут быть записаны следующим образом:

12.34
1234e-2
1.234E1

Эти числа имеют одинаковое значение, 12,34. Вы также можете использовать подчеркивания в числах с плавающей точкой.

Рациональные литералы

Вы можете записать литерал Rational с использованием специального суффикса, 'r'.

Примеры:

1r       # => (1/1)
2/3r     # => (2/3)   # With denominator.
-1r      # => (-1/1)  # With signs.
-2/3r    # => (-2/3)
2/-3r    # => (-2/3)
-2/-3r   # => (2/3)
+1/+3r   # => (1/3)
1.2r     # => (6/5)   # With fractional part.
1_1/2_1r # => (11/21) # With embedded underscores.
2/4r     # => (1/2)   # Automatically reduced.

Синтаксис:

<rational-literal> = <numerator> [ '/' <denominator> ] 'r'
<numerator> = [ <sign> ] <digits> [ <fractional-part> ]
<fractional-part> = '.' <digits>
<denominator> = [ sign ] <digits>
<sign> = '-' | '+'
<digits> = <digit> { <digit> | '_' <digit> }
<digit> = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'

Обратите внимание на это, которое анализируется как числитель с плавающей точкой 1.2 поделенный на знаменатель с рациональными 3r, что приводит к значению с плавающей точкой:

1.2/3r  # => 0.39999999999999997

Комплексные литералы

Вы можете записать Complex число следующим образом (с суффиксом i):

1i          #=> (0+1i)
1i * 1i     #=> (-1+0i)

Также рациональные числа могут быть мнимыми числами.

12.3ri      #=> (0+(123/10)*i)

i должен быть размещен после r; обратное не допускается.

12.3ir      #=> Syntax error

Строки

Строковые литералы

Самый распространенный способ записи строк — использование ":

"This is a string."

Строка может быть многострочной.

Любой внутренний " должен быть экранирован:

"This string has a quote: \".  As you can see, it is escaped"

Строки в двойных кавычках позволяют экранировать символы, такие как \n для новой строки, \t для табуляции и т. д. Полный список поддерживаемых последовательностей экранирования приведен ниже:

\a             bell, ASCII 07h (BEL)
\b             backspace, ASCII 08h (BS)
\t             horizontal tab, ASCII 09h (TAB)
\n             newline (line feed), ASCII 0Ah (LF)
\v             vertical tab, ASCII 0Bh (VT)
\f             form feed, ASCII 0Ch (FF)
\r             carriage return, ASCII 0Dh (CR)
\e             escape, ASCII 1Bh (ESC)
\s             space, ASCII 20h (SPC)
\\             backslash, \
\nnn           octal bit pattern, where nnn is 1-3 octal digits ([0-7])
\xnn           hexadecimal bit pattern, where nn is 1-2 hexadecimal digits ([0-9a-fA-F])
\unnnn         Unicode character, where nnnn is exactly 4 hexadecimal digits ([0-9a-fA-F])
\u{nnnn ...}   Unicode character(s), where each nnnn is 1-6 hexadecimal digits ([0-9a-fA-F])
\cx or \C-x    control character, where x is an ASCII printable character
\M-x           meta character, where x is an ASCII printable character
\M-\C-x        meta control character, where x is an ASCII printable character
\M-\cx         same as above
\c\M-x         same as above
\c? or \C-?    delete, ASCII 7Fh (DEL)

Любой другой символ после обратного слэша интерпретируется как сам символ.

Строки в двойных кавычках позволяют интерполировать другие значения с использованием #{...}:

"One plus one is two: #{1 + 1}"

Любое выражение может быть помещено в интерполируемую секцию, но для повышения удобочитаемости лучше использовать небольшие выражения.

Вы также можете использовать #@foo, #@@foo и #$foo в качестве сокращений соответственно для #{ @foo }, #{ @@foo } и #{ $foo }.

Интерполяция может быть отключена путем экранирования символа «#» или использования строк в одинарных кавычках:

'#{1 + 1}' #=> "\#{1 + 1}"

Помимо отключения интерполяции, строки в одинарных кавычках также отключают все последовательности экранирования, кроме одинарной кавычки (\') и обратного слэша (\\).

Смежные строковые литералы автоматически конкатенируются интерпретатором:

"con" "cat" "en" "at" "ion" #=> "concatenation"
"This string contains "\
"no newlines."              #=> "This string contains no newlines."

Любая комбинация смежных строк в одинарных и двойных кавычках, а также строк с процентом будет конкатенирована, если строка с процентом не является последней.

%q{a} 'b' "c" #=> "abc"
"a" 'b' %q{c} #=> NameError: uninitialized constant q

Также есть обозначение литерала символа для представления строковых литералов длиной в один символ, синтаксис которого — вопросительный знак (?) за которым следует один символ или последовательность экранирования, соответствующая одному кодовому элементу в кодировке скрипта:

?a       #=> "a"
?abc     #=> SyntaxError
?\n      #=> "\n"
?\s      #=> " "
?\\      #=> "\\"
?\u{41}  #=> "A"
?\C-a    #=> "\x01"
?\M-a    #=> "\xE1"
?\M-\C-a #=> "\x81"
?\C-\M-a #=> "\x81", same as above
?あ      #=> "あ"

См. также:

  • %q: Неинтерполируемые строковые литералы

  • % и %Q: Интерполируемые строковые литералы

Литералы документов Here

Если вы пишете большой блок текста, вы можете использовать «документ here» или «heredoc»:

expected_result = <<HEREDOC
This would contain specially formatted text.

That might span many lines
HEREDOC

Heredoc начинается в строке, следующей за <<HEREDOC, и заканчивается следующей строкой, начинающейся с HEREDOC. Результат включает завершающий символ новой строки.

Вы можете использовать любой идентификатор с heredoc, но обычно используются идентификаторы с заглавными буквами.

Вы можете отступать завершающий идентификатор, если вы поместите тире «-» после <<:

  expected_result = <<-INDENTED_HEREDOC
This would contain specially formatted text.

That might span many lines
  INDENTED_HEREDOC

Обратите внимание, что, хотя закрывающий идентификатор может иметь отступ, содержимое всегда обрабатывается так, как будто оно выровнено по левому краю. Если вы отступите содержимое, эти пробелы отобразятся в выводе.

Чтобы иметь отступаемое содержимое, а также отступаемый закрывающий идентификатор, вы можете использовать «волнистый» heredoc, в котором используется «~» вместо «-» после <<:

expected_result = <<~SQUIGGLY_HEREDOC
  This would contain specially formatted text.

  That might span many lines
SQUIGGLY_HEREDOC

Отступ самой неотступленной строки будет удален из каждой строки содержимого. Обратите внимание, что пустые строки и строки, состоящие только из табуляций и пробелов, будут проигнорированы для целей определения отступа, но экранированные табуляции и пробелы считаются неотступаемыми символами.

Heredoc позволяет интерполировать и экранировать символы. Вы можете отключить интерполяцию и экранирование, поместив открывающий идентификатор в одинарные кавычки:

expected_result = <<-'EXPECTED'
One plus one is #{1 + 1}
EXPECTED

p expected_result # prints: "One plus one is \#{1 + 1}\n"

Идентификатор также может быть заключен в двойные кавычки (что эквивалентно отсутствию кавычек) или в обратные кавычки. При заключении в обратные кавычки HEREDOC ведет себя как Kernel#`:

puts <<-`HEREDOC`
cat #{__FILE__}
HEREDOC

При заключении в кавычки в качестве идентификатора можно использовать любой символ, кроме этой кавычки и новой строки (CR и/или LF).

Для вызова метода на heredoc поместите его после открывающего идентификатора:

expected_result = <<-EXPECTED.chomp
One plus one is #{1 + 1}
EXPECTED

Вы можете открыть несколько heredocs в одной строке, но это может быть сложно читать:

puts(<<-ONE, <<-TWO)
content for heredoc one
ONE
content for heredoc two
TWO

Символьные литералы

A Symbol представляет собой имя внутри интерпретатора Ruby. Подробнее о том, что такое символы и когда Ruby создает их внутренне, см. Symbol.

Вы можете сослаться на символ, используя двоеточие: :my_symbol.

Вы также можете создавать символы с помощью интерполяции:

:"my_symbol1"
:"my_symbol#{1 + 1}"

Как и строки, одинарная кавычка может быть использована для отключения интерполяции:

:'my_symbol#{1 + 1}' #=> :"my_symbol\#{1 + 1}"

При создании Hash, существует специальный синтаксис для ссылки на Symbol также.

См. также:

  • %s: Символьные литералы

Массивы литералов

Массив создается с использованием объектов между [ и ]:

[1, 2, 3]

Вы можете поместить выражения внутри массива:

[1, 1 + 1, 1 + 2]
[1, [1 + 1, [1 + 2]]]

См. также:

  • %w и %W: Литералы массива строк

  • %i и %I: Литералы массива символов

См. Array для методов, которые можно использовать с массивом.

Хеш-литералы

Хеш создается с использованием пар ключ-значение между { и }:

{ "a" => 1, "b" => 2 }

И ключ, и значение могут быть любыми объектами.

Вы можете создать хеш, используя символьные ключи с помощью следующего синтаксиса:

{ a: 1, b: 2 }

Этот же синтаксис используется для ключевых аргументов для метода.

Как и литералы Symbol, вы можете использовать кавычки для символьных ключей.

{ "a 1": 1, "b #{1 + 1}": 2 }

равно

{ :"a 1" => 1, :"b 2" => 2 }

Hash значения могут быть опущены, что означает, что значение будет взято из контекста по имени ключа:

x = 100
y = 200
h = { x:, y: }
#=> {:x=>100, :y=>200}

См. Hash для методов, которые можно использовать с хешем.

Диапазонные литералы

Диапазон представляет собой интервал значений. Диапазон может включать или исключать конечное значение.

(1..2)  # includes its ending value
(1...2) # excludes its ending value
(1..)   # endless range, representing infinite sequence from 1 to Infinity
(..1)   # beginless range, representing infinite sequence from -Infinity to 1

Вы можете создать диапазон любых объектов. См. документацию Range для получения подробной информации о методах, которые необходимо реализовать.

Литералы регулярных выражений

Регулярное выражение можно создать, используя ведущие и хвостовые косые черты ('/') символы:

re = /foo/ # => /foo/
re.class   # => Regexp

За хвостовой косой чертой могут следовать один или несколько символов флагов, которые изменяют поведение. Подробности см. в разделе «Опции регулярных выражений» Regexp options.

Интерполяция может использоваться внутри регулярных выражений вместе с экранированными символами. Обратите внимание, что регулярное выражение может потребовать дополнительных экранированных символов, чем строка.

См. также:

  • %r: Регулярные выражения (Regexp)

См. Regexp для описания синтаксиса регулярных выражений.

Lambda Proc Литералы

Лямбда-процедура может быть создана с помощью ->:

-> { 1 + 1 }

Вызов вышеуказанной процедуры вернёт результат 2.

Вы можете потребовать аргументов для процедуры следующим образом:

->(v) { 1 + v }

Эта процедура добавит единицу к своему аргументу.

Процентные литералы

Каждый из литералов в этом разделе может использовать следующие парные разделители:

  • [ и ].

  • ( и ).

  • { и }.

  • < и >.

  • Любой другой символ, как начальный, так и конечный разделитель.

Эти примеры показаны в следующем разделе.

%q: Неинтерполируемые String Литералы

Вы можете записать неинтерполируемую строку с помощью %q. Созданная строка будет такой же, как если бы вы создали её с помощью одинарных кавычек:

%[foo bar baz]        # => "foo bar baz" # Using [].
%(foo bar baz)        # => "foo bar baz" # Using ().
%{foo bar baz}        # => "foo bar baz" # Using {}.
%<foo bar baz>        # => "foo bar baz" # Using <>.
%|foo bar baz|        # => "foo bar baz" # Using two |.
%:foo bar baz:        # => "foo bar baz" # Using two :.
%q(1 + 1 is #{1 + 1}) # => "1 + 1 is \#{1 + 1}" # No interpolation.

% and %Q: Интерполируемые String Литералы

Вы можете записать интерполируемую строку с помощью %Q или её псевдонима %:

%[foo bar baz]       # => "foo bar baz"
%(1 + 1 is #{1 + 1}) # => "1 + 1 is 2" # Interpolation.

%w and %W: Литералы массива строк

Вы можете записать массив строк с помощью %w (неинтерполируемый) или %W (интерполируемый):

%w[foo bar baz]       # => ["foo", "bar", "baz"]
%w[1 % *]             # => ["1", "%", "*"]
# Use backslash to embed spaces in the strings.
%w[foo\ bar baz\ bat] # => ["foo bar", "baz bat"]
%w(#{1 + 1})          # => ["\#{1", "+", "1}"]
%W(#{1 + 1})          # => ["2"]

%i and %I: Литералы массива символов

Вы можете записать массив символов с помощью %i (неинтерполируемый) или %I (интерполируемый):

%i[foo bar baz]       # => [:foo, :bar, :baz]
%i[1 % *]             # => [:"1", :%, :*]
# Use backslash to embed spaces in the symbols.
%i[foo\ bar baz\ bat] # => [:"foo bar", :"baz bat"]
%i(#{1 + 1})          # => [:"\#{1", :+, :"1}"]
%I(#{1 + 1})          # => [:"2"]

%s: Symbol Литералы

Вы можете записать символ с помощью %s:

:foo     # => :foo
:foo bar # => :"foo bar"

%r: Regexp Литералы

Вы можете записать регулярное выражение с помощью %r; символ, используемый в качестве ведущего и заключительного разделителя, может быть (почти) любым символом:

%r/foo/             # => /foo/
%r:name/value pair: # => /name\/value pair/

Несколько “симметричных” пар символов могут использоваться в качестве разделителей:

%r[foo] # => /foo/
%r{foo} # => /foo/
%r(foo) # => /foo/
%r<foo> # => /foo/

Завершающий разделитель может быть последован одним или несколькими символами флагов, которые изменяют поведение. Подробнее см. опции регулярных выражений.

%x: Литералы обратных кавычек

Вы можете написать и выполнить командную оболочку с помощью %x:

%x(echo 1) # => "1\n"

Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API