Переменные
Переменная в 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 выдаст ошибку:
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; в частности, категории символов Юникода Lu/Ll/Lt/Lm/Lo/Nl (буквы), Sc/So (валюты и другие символы), и некоторые другие символы, похожие на буквы (например, подмножество математических символов Sm) допускаются. Последующие символы также могут включать ! и цифры (0-9 и другие символы в категориях Nd/No), а также другие кодовые точки Юникода: диакритические знаки и другие знаки модификации (категории Mn/Mc/Me/Sk), некоторые знаки пунктуации (категория Pc), штрихи и некоторые другие символы.
Операторы, такие как +, также являются допустимыми идентификаторами, но анализируются специально. В некоторых контекстах операторы могут использоваться как переменные; например, (+) относится к функции сложения, а (+) = f переназначит её. Большинство инфиксных операторов Юникода (в категории Sm), таких как ⊕, анализируются как инфиксные операторы и доступны для пользовательских методов (например, вы можете использовать const ⊗ = kron для определения ⊗ как инфиксного произведения Кронекера). Операторы также могут иметь знаки модификации, штрихи и нижние/верхние индексы, например +̂ₐ″ анализируется как инфиксный оператор с тем же приоритетом, что и +. Между оператором, заканчивающимся буквой нижнего/верхнего индекса, и последующим именем переменной требуется пробел. Например, если +ᵃ — это оператор, то +ᵃx должно быть записано как +ᵃ x, чтобы отличить его от + ᵃx, где ᵃx — имя переменной.
Определённый класс имён переменных состоит только из подчеркиваний. Этим идентификаторам можно присваивать значения, которые немедленно удаляются, и, следовательно, они не могут использоваться для присваивания значений другим переменным (т.е., они не могут использоваться в качестве rvalues) или каким-либо образом использовать последнее присвоенное значение.
julia> x, ___ = size([2 2; 1 1]) (2, 2) julia> y = ___ ERROR: syntax: all-underscore identifier used as rvalue julia> println(___) ERROR: syntax: all-underscore identifier used as rvalue
Единственные явно запрещённые имена переменных — это имена встроенных Ключевых слов:
julia> else = false ERROR: syntax: unexpected "else" julia> try = "No" ERROR: syntax: unexpected "="
Некоторые символы Юникода считаются эквивалентными в идентификаторах. Разные способы ввода комбинированных символов Юникода (например, знаки ударения) обрабатываются как эквивалентные (конкретно, идентификаторы Julia находятся в NFC). Julia также включает несколько нестандартных эквивалентов для символов, визуально похожих и легко вводимых с помощью некоторых методов ввода. Символы Юникода ɛ (U+025B: маленькая открытая буква е) и µ (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.
Когда вы вызываете функцию в 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.10/manual/variables/