Переменные
Переменная в Julia — это имя, связанное (или привязанное) к значению. Она полезна, когда нужно сохранить значение (например, полученное после каких-то математических вычислений) для дальнейшего использования. Например:
# Assign the value 10 to the variable x julia> x = 10 10 # Doing math with x's value julia> x + 1 11 # Reassign x's value julia> x = 1 + 1 2 # You can assign values of other types, like strings of text julia> x = "Hello World!" "Hello World!"
Julia предоставляет чрезвычайно гибкую систему именования переменных. Имена переменных чувствительны к регистру и не имеют семантического значения (то есть язык не будет обрабатывать переменные по-разному на основе их имён).
julia> x = 1.0 1.0 julia> y = -3 -3 julia> Z = "My string" "My string" julia> customary_phrase = "Hello world!" "Hello world!" julia> UniversalDeclarationOfHumanRightsStart = "人人生而自由,在尊严和权利上一律平等。" "人人生而自由,在尊严和权利上一律平等。"
Разрешены имена с использованием Юникода (в кодировке UTF-8):
julia> δ = 0.00001 1.0e-5 julia> 안녕하세요 = "Hello" "Hello"
В интерактивной оболочке Julia REPL и нескольких других средах редактирования Julia вы можете вводить многие математические символы Юникода, набирая обратный слеш, имя LaTeX-символа и нажимая клавишу Tab. Например, имя переменной δ можно ввести, набрав \delta-tab, или даже α̂⁽²⁾ с помощью \alpha-tab-\hat- tab-\^(2)-tab. (Если вы найдёте символ в коде другого человека, например, и не знаете, как его набрать, подсказка REPL вам поможет: просто наберите ? и затем вставьте символ.)
Julia даже позволит вам затенять существующие экспортированные константы и функции локальными (хотя это не рекомендуется, чтобы избежать потенциальных разночтений):
julia> pi = 3 3 julia> pi 3 julia> sqrt = 4 4 julia> length() = 5 length (generic function with 1 method) julia> Base.length length (generic function with 79 methods)
Однако, если вы попытаетесь переопределить встроенную константу или функцию, уже используемую в данный момент, Julia выдаст ошибку:
julia> pi π = 3.1415926535897... julia> pi = 3 ERROR: cannot assign a value to imported variable Base.pi from module Main julia> sqrt(100) 10.0 julia> sqrt = 4 ERROR: cannot assign a value to imported variable Base.sqrt from module Main
Разрешенные имена переменных
Имена переменных должны начинаться с буквы (A-Z или a-z), подчёркивания или подмножества кодовых точек Юникода, больших 00A0; в частности, разрешены категории символов Unicode Lu/Ll/Lt/Lm/Lo/Nl (буквы), Sc/So (валюты и другие символы), а также некоторые другие буквенные символы (например, подмножество математических символов Sm). Следующие символы также могут включать ! и цифры (0-9 и другие символы в категориях Nd/No), а также другие кодовые точки Unicode: диакритические и другие модификаторы (категории Mn/Mc/Me/Sk), некоторые знаки пунктуации (категория Pc), штрихи и некоторые другие символы.
Операторы, такие как + также являются допустимыми идентификаторами, но анализируются особенно. В некоторых контекстах операторы могут использоваться как переменные; например, (+) ссылается на функцию сложения, а (+) = f переназначит её. Большинство инфиксных операторов Unicode (в категории Sm), таких как ⊕, анализируются как инфиксные операторы и доступны для пользовательских методов (например, вы можете использовать const ⊗ = kron для определения ⊗ как инфиксного произведения Кронекера). Операторы также могут быть снабжены модификаторами, штрихами и нижними/верхними индексами, например, +̂ₐ″ анализируется как инфиксный оператор с тем же приоритетом, что и +. Между оператором, оканчивающимся буквой нижнего/верхнего индекса, и последующим именем переменной требуется пробел. Например, если +ᵃ является оператором, то +ᵃx должно быть записано как +ᵃ x, чтобы отличить его от + ᵃx, где ᵃx является именем переменной.
Особый класс имён переменных — это имена, содержащие только подчёркивания. Эти идентификаторы являются только для записи. То есть им можно присваивать значения, которые сразу же отбрасываются, и их значения нельзя использовать ни в каком виде.
julia> x, ___ = size([2 2; 1 1]) (2, 2) julia> y = ___ ERROR: syntax: all-underscore identifiers are write-only and their values cannot be used in expressions julia> println(___) ERROR: syntax: all-underscore identifiers are write-only and their values cannot be used in expressions
Единственные явно запрещённые имена для переменных — это имена встроенных ключевых слов:
julia> else = false ERROR: syntax: unexpected "else" julia> try = "No" ERROR: syntax: unexpected "="
Некоторые символы Юникода считаются эквивалентными в идентификаторах. Различные способы ввода символов комбинирования Юникода (например, акцентов) рассматриваются как эквивалентные (в частности, идентификаторы Julia находятся в NFC). Julia также включает несколько нестандартных эквивалентностей для символов, которые визуально похожи и легко набираются некоторыми методами ввода. Символы Юникода ɛ (U+025B: строчная буква открытая e) и µ (U+00B5: знак микро) рассматриваются как эквивалентные соответствующим греческим буквам. Средняя точка · (U+00B7) и греческий интерпункт · (U+0387) оба рассматриваются как математический оператор точки ⋅ (U+22C5). Знак минус − (U+2212) рассматривается как эквивалент знаку дефис-минус - (U+002D).
Выражения присваивания и присваивание против мутации
Присваивание variable = value "связывает" имя variable со значением value, вычисленным в правой части, и всё присваивание обрабатывается Julia как выражение, равное значению правой части value. Это означает, что присваивания могут быть цепными (одно и то же value присваивается нескольким переменным с variable1 = variable2 = value или же использоваться в других выражениях, а также объясняет, почему их результат отображается в интерактивной оболочке REPL как значение правой части. (В целом, REPL отображает значение любого выражения, которое вы вычисляете.) Например, здесь значение 4 переменной b = 2+2 используется в другом арифметическом операторе и присваивании:
julia> a = (b = 2+2) + 3 7 julia> a 7 julia> b 4
Распространённое недоразумение — это различие между присваиванием (придание нового "имени" значению) и мутацией (изменение значения). Если вы выполните a = 2 за которым следует a = 3, вы измените "имя" a так, чтобы оно ссылалось на новое значение 3 … но вы не измените число 2, поэтому 2+2 всё равно выдаст 4 и не 6! Это различие становится более ясным при работе с изменяемыми типами, такими как массивы, содержимое которых может изменяться:
julia> a = [1,2,3] # an array of 3 integers
3-element Vector{Int64}:
1
2
3
julia> b = a # both b and a are names for the same array!
3-element Vector{Int64}:
1
2
3
Здесь строка b = a не создаёт копию массива a, она просто связывает имя b с тем же массивом a: и b, и a "указывают" на один массив [1,2,3] в памяти. В отличие от этого, присваивание a[i] = value изменяет содержимое массива, и изменённый массив будет виден через оба имени a и b:
julia> a[1] = 42 # change the first element
42
julia> a = 3.14159 # a is now the name of a different object
3.14159
julia> b # b refers to the original array object, which has been mutated
3-element Vector{Int64}:
42
2
3
То есть a[i] = value (псевдоним для setindex!) изменяет существующий объект массива в памяти, доступный через a или b. Последующее присваивание a = 3.14159 не изменяет этот массив, оно просто связывает a с другим объектом; массив всё ещё доступен через b. Другой распространённый синтаксис для изменения существующего объекта — это a.field = value (псевдоним для setproperty!), который можно использовать для изменения mutable struct. Также есть мутация через присваивание с помощью точки, например, b .= 5:7 (которая изменяет наш массив b на месте, чтобы он содержал [5,6,7]), как часть векторизованного синтаксиса Julia "точка" .
При вызове функции в Julia она действует так, как будто вы присвоили значения аргументов новым именам переменных, соответствующим аргументам функции, как обсуждается в Поведении передачи аргументов. (По конвенции, функции, изменяющие один или несколько своих аргументов, имеют имена, оканчивающиеся на !.)
Стилевые соглашения
Хотя Julia накладывает мало ограничений на допустимые имена, полезно принять следующие соглашения:
- Имена переменных — строчные.
- Разделение слов может быть показано с помощью подчёркиваний (
'_'), но подчёркивания не рекомендуются, если имя и так легко читается. - Имена
TypeиModuleначинаются с большой буквы, а разделение слов — с верхнего регистрового стиля, а не с подчёркиваний. - Имена
functionиmacro— строчные без подчёркиваний. - Функции, записывающие в свои аргументы, имеют имена, оканчивающиеся на
!. Эти функции иногда называются «изменяющими» или «на месте» функциями, потому что они предназначены для внесения изменений в свои аргументы после вызова функции, а не только для возврата значения.
Дополнительную информацию о стилистических соглашениях см. в Руководстве по стилю.
© 2009–2024 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.11/manual/variables/