基本要素
导言
Julia Base包含一系列适用于执行科学和数值计算的函数和宏,但也与许多通用编程语言一样广泛。 更多的功能可以从越来越多的https://julialang.org/packages/[可用的软件包]。 功能按以下主题分组。
一些一般注释:
*要使用模块功能,请使用 导入模块 要导入模块,以及 模块。fn(x) 要使用的功能。
*或者, 使用模块 将导入所有导出 模块 函数到当前命名空间。
*按照惯例,以感叹号结尾的函数名(!)修改他们的论点。 有些函数有两种修改(例如, 排序!)和非修改(排序)版本。
的行为 基地 标准库是稳定的,如https://semver.org/[SemVer]只有当他们被记录;即,包括在https://docs.julialang.org/[Julia文档]并且没有标记为不稳定。 见 API常见问题了解更多信息。
四处游荡
# *`基地。atexit,atexit`*-函数
atexit(f)
注册一个零参数或一参数函数 f() 在进程退出时被调用。 atexit() 钩子按后进先出(LIFO)顺序调用,并在对象终结器之前运行。
如果 f 有一个为一个整数参数定义的方法,它将被称为 f(n::Int32),在哪里 n 是当前退出代码,否则将调用为 f().
|
兼容性
Julia1.9单参数形式要求Julia1.9 |
允许调用退出挂钩 出口(n),在这种情况下,Julia将以退出代码退出 n (而不是原来的退出代码)。 如果多个退出挂钩调用 出口(n),然后Julia将使用与调用的最后一个调用的exit钩子对应的exit代码退出 出口(n). (因为exit钩子是按LIFO顺序调用的,所以"last called"相当于"first registered"。)
注意:一旦调用了所有的退出钩子,就不能注册更多的退出钩子,并且任何调用 atexit(f) 所有钩子完成后会抛出异常。 如果您正在注册可能仍在关闭期间并发执行的后台任务的退出挂钩,则可能会出现这种情况。
# *`基地。摘要大小`*-函数
Base.summarysize(obj; exclude=Union{...}, chargeall=Union{...}) -> Int
计算从参数可访问的所有唯一对象使用的内存量(以字节为单位)。
*关键字参数*
* 排除在外:指定要从遍历中排除的对象类型。
* 收费:指定对象的类型,以始终计算其所有字段的大小,即使这些字段通常被排除在外。
请参阅 大小;大小.
*例子*
julia> Base.summarysize(1.0)
8
julia> Base.summarysize(Ref(rand(100)))
848
julia> sizeof(Ref(rand(100)))
8
# *`基地。__预编译__`*-函数
__precompile__(isprecompilable::Bool)
指定调用此函数的文件是否可预编译,默认为 真的. 如果一个模块或文件是_not_安全可预编译的,它应该调用 __预编译__(false) 为了抛出一个错误,如果朱莉娅试图预编译它。
# *`基地。包括`*-函数
Base.include([mapexpr::Function,] m::Module, path::AbstractString)
在模块的全局范围内评估输入源文件的内容 m. 每个模块(除了那些定义与 裸模,裸模)有自己的定义 包括 省略 m 参数,它计算该模块中的文件。 返回输入文件的最后一个计算表达式的结果。 在包含过程中,任务本地包含路径设置为包含文件的目录。 嵌套调用 包括 将相对于该路径进行搜索。 此函数通常用于以交互方式加载源,或组合被分解为多个源文件的包中的文件。
可选的第一个参数 地图表达 可用于在计算包含的代码之前对其进行转换:对于每个解析的表达式 expr 在 路径,的 包括 函数实际计算 地图表达(expr). 如果省略, 地图表达 默认值为 身份认同.
|
兼容性
茱莉亚1.5茱莉亚1.5是通过 |
# *`包括`*-函数
include([mapexpr::Function,] path::AbstractString)
在包含模块的全局范围内评估输入源文件的内容。 每个 模块 (定义为 裸模,裸模)有一个私有的1参数定义 包括,它评估该模块中的文件,以便在该模块中使用。 返回输入文件的最后一个计算表达式的结果。 在包含过程中,任务本地包含路径设置为包含文件的目录。 嵌套调用 包括 将相对于该路径进行搜索。 此函数通常用于以交互方式加载源,或组合被分解为多个源文件的包中的文件。 论点 路径 被归一化使用 规范路径这将解析相对路径令牌,如 .. 并转换 / 到适当的路径分隔符。
可选的第一个参数 地图表达 可用于在计算包含的代码之前对其进行转换:对于每个解析的表达式 expr 在 路径,的 包括 函数实际计算 地图表达(expr). 如果省略, 地图表达 默认值为 身份认同.
使用方法 基地。包括评估一个文件到另一个模块。
|
注意Julia的语法降低识别对文字的显式调用 |
|
兼容性
茱莉亚1.5茱莉亚1.5是通过 |
# *`基地。include_string`*-函数
include_string([mapexpr::Function,] m::Module, code::AbstractString, filename::AbstractString="string")
像 包括,除了从给定的字符串而不是从文件中读取代码。
可选的第一个参数 地图表达 可用于在计算包含的代码之前对其进行转换:对于每个解析的表达式 expr 在 密码,的 include_string 函数实际计算 地图表达(expr). 如果省略, 地图表达 默认值为 身份认同.
|
兼容性
茱莉亚1.5茱莉亚1.5是通过 |
# *`基地。包括独立性`*-函数
include_dependency(path::AbstractString; track_content::Bool=true)
在模块中,声明由 路径 (相对或绝对)是预编译的依赖项;也就是说,如果 track_content=true 该模块将需要重新编译,如果内容 路径 更改(如果 路径 是内容等于的目录 join(readdir(path))). 如果 track_content=false 修改时间时触发重新编译 m时间 的 路径 变化。
只有当您的模块依赖于不使用via的路径时,才需要这样做 包括. 它在编译之外没有任何影响。
|
兼容性
Julia1.11关键字参数 |
# *`__init__`*-密码_
__init__
该 __init__() 模块中的函数立即执行_after_模块在运行时首次加载。 在模块中的所有其他语句执行完毕后,它被调用一次。 因为它是在完全导入模块后调用的, __init__ 子模块的功能将首先执行。 两个典型的用途 __init__ 正在调用外部C库的运行时初始化函数,并初始化涉及外部库返回的指针的全局常量。 查看 关于模块的手册部分了解更多细节。
请参阅: 一次处理.
*例子*
const foo_data_ptr = Ref{Ptr{Cvoid}}(0)
function __init__()
ccall((:foo_init, :libfoo), Cvoid, ())
foo_data_ptr[] = ccall((:foo_data, :libfoo), Ptr{Cvoid}, ())
nothing
end
# *`基地。一次处理`*-类型
OncePerProcess{T}(init::Function)() -> T
打电话给 一次处理 对象返回类型的值 T 通过运行函数 初始化器 每个过程只需一次。 同一进程中的所有并发和未来调用将返回完全相同的值。 这在将被预编译的代码中很有用,因为它允许设置缓存或其他不会被序列化的状态。
|
兼容性
Julia1.12这种类型需要Julia1.12或更高版本。 |
*例子*
julia> const global_state = Base.OncePerProcess{Vector{UInt32}}() do
println("Making lazy global value...done.")
return [Libc.rand()]
end;
julia> (procstate = global_state()) |> typeof
Making lazy global value...done.
Vector{UInt32} (alias for Array{UInt32, 1})
julia> procstate === global_state()
true
julia> procstate === fetch(@async global_state())
true
# *`基地。OncePerTask`*-类型
OncePerTask{T}(init::Function)() -> T
打电话给 OncePerTask 对象返回类型的值 T 通过运行函数 初始化器 每个任务只需一次。 同一任务中的所有未来调用将返回完全相同的值。
请参阅: 任务_local_storage.
|
兼容性
Julia1.12这种类型需要Julia1.12或更高版本。 |
*例子*
julia> const task_state = Base.OncePerTask{Vector{UInt32}}() do
println("Making lazy task value...done.")
return [Libc.rand()]
end;
julia> (taskvec = task_state()) |> typeof
Making lazy task value...done.
Vector{UInt32} (alias for Array{UInt32, 1})
julia> taskvec === task_state()
true
julia> taskvec === fetch(@async task_state())
Making lazy task value...done.
false
# *`基地。一旦线程`*-类型
OncePerThread{T}(init::Function)() -> T
打电话给 一旦线程 对象返回类型的值 T 通过运行函数 初始化器 每个线程正好一次。 同一线程中的所有未来调用以及具有相同线程id的并发或未来调用将返回完全相同的值。 对象也可以由任何现有线程的threadid索引,以获取(或初始化_on this thread_)为该线程存储的值。 不正确的使用可能会导致数据竞争或内存损坏,因此仅当该行为在库的线程安全设计中是正确的时才使用。
|
警告一个任务只在一个线程上运行并不一定是真的,因此这里返回的值可能会别名其他值或在程序中间发生变化。 此函数将来可能会被弃用。 如果初始值设定项产生,则在调用后运行当前任务的线程可能与调用开始时的线程不同。 |
请参阅: OncePerTask.
|
兼容性
Julia1.12这种类型需要Julia1.12或更高版本。 |
*例子*
julia> const thread_state = Base.OncePerThread{Vector{UInt32}}() do
println("Making lazy thread value...done.")
return [Libc.rand()]
end;
julia> (threadvec = thread_state()) |> typeof
Making lazy thread value...done.
Vector{UInt32} (alias for Array{UInt32, 1})
julia> threadvec === fetch(@async thread_state())
true
julia> threadvec === thread_state[Threads.threadid()]
true
关键词
这是Julia中的保留关键字列表: 裸模,裸模, 開始啦。, 休息, 渔获, 康斯特, 继续, 做, 其他, 埃尔塞夫, 结束, 出口, 错误, 最后, 为, 功能, 全球, 如果, 进口, 让, 本地, 宏, 模块, 报价, 回来吧, 结构体, 真的, 试试, 使用, 而. 这些关键字不允许用作变量名。
保留以下两个字序列: 抽象类型, 可变结构, 原始类型. 但是,您可以使用名称创建变量: 摘要, 可变的, 原始的 和 类型.
最后: 哪里 被解析为中缀运算符,用于编写参数化方法和类型定义; 在 和 伊萨 被解析为中缀运算符; 公众人士 在开始toplevel语句时被解析为关键字; 外,外 在迭代规范中用于修改变量的范围时,被解析为关键字 为 循环;以及 作为 用作关键字来重命名带入范围的标识符 进口 或 使用. 创建命名的变量 哪里, 在, 伊萨, 外,外 和 作为 不过是允许的。
# *`模块`*-密码_
module
模块 声明a 模块,这是一个单独的全局变量工作区。 在模块中,您可以控制其他模块的哪些名称是可见的(通过导入),并指定哪些名称是公开的(通过 出口 和 公众人士). 模块允许您创建顶级定义,而不必担心当您的代码与其他人的代码一起使用时的名称冲突。 关于模块的手册部分了解更多细节。
*例子*
module Foo
import Base.show
export MyType, foo
struct MyType
x
end
bar(x) = 2x
foo(a::MyType) = bar(a.x) + 1
show(io::IO, a::MyType) = print(io, "MyType $(a.x)")
end
# *`使用`*-密码_
using
使用Foo 将加载模块或包 [医]脚 并使其 出口可直接使用的ed名称。 名称也可以通过点语法使用(例如 Foo。[医]脚 访问名称 [医]脚),无论它们是 出口爱德与否。 查看 关于模块的手册部分有关详细信息。
|
请注意,当两个或多个包/模块导出一个名称时,该名称在每个包中不引用相同的东西,并且这些包是通过 |
# *`作为`*-密码_
as
作为 用作关键字来重命名带入范围的标识符 进口 或 使用,用于解决名称冲突以及缩短名称。 (外 进口 或 使用 声明, 作为 不是关键字,可以用作普通标识符。)
将LinearAlgebra导入为LA 带来进口的 线性代数 标准库纳入范围为 洛杉矶.
导入LinearAlgebra:eigen作为eig,cholesky作为chol 带来 本征 和 乔莱斯基 方法从 线性代数 范围为 eig 和 卓尔 分别。
作为 与 使用 只有当个别标识符被带入范围时。 例如, 使用LinearAlgebra:eigen作为eig 或 使用LinearAlgebra:eigen作为eig,cholesky作为chol 有效,但是 使用LinearAlgebra作为LA 是无效的语法,因为重命名_all_导出的名称是无意义的 线性代数 到 洛杉矶.
# *`宏`*-密码_
macro
宏 定义将生成的代码插入到程序中的方法。 宏将参数表达式序列映射到返回的表达式,并在调用宏时将生成的表达式直接替换到程序中。 宏是一种无需调用即可运行生成代码的方法 埃瓦尔,因为生成的代码反而简单地成为周围程序的一部分。 宏参数可以包括表达式、文字值和符号。 宏可以为可变数量的参数(varargs)定义,但不接受关键字参数。 每个宏也隐式传递参数 __来源__,其中包含宏从中调用的行号和文件名,以及 __模块__,这是宏展开的模块。
请参阅手册部分 元编程有关如何编写宏的更多信息。
*例子*
julia> macro sayhello(name)
return :( println("Hello, ", $name, "!") )
end
@sayhello (macro with 1 method)
julia> @sayhello "Charlie"
Hello, Charlie!
julia> macro saylots(x...)
return :( println("Say: ", $(x...)) )
end
@saylots (macro with 1 method)
julia> @saylots "hey " "there " "friend"
Say: hey there friend
# *`回来吧`*-密码_
return
返回x 导致封闭函数提前退出,传递给定值 x 回到呼叫者那里。 回来吧 本身没有价值相当于 什么也不退货 (见 什么都没有).
function compare(a, b)
a == b && return "equal to"
a < b ? "less than" : "greater than"
end
一般来说,你可以放置一个 回来吧 语句在函数体内的任何地方,包括深度嵌套的循环或条件,但要小心 做 街区。 例如:
function test1(xs)
for x in xs
iseven(x) && return 2x
end
end
function test2(xs)
map(xs) do x
iseven(x) && return 2x
x
end
end
在第一个例子中,返回打破了 测试1 只要它击中一个偶数,所以 测试1([5,6,7]) 申报表 12.
您可能期望第二个例子的行为方式相同,但实际上 回来吧 只有_inner_函数(在 做 块)并给出一个值回 地图. 测试2([5,6,7]) 然后返回 [5,12,7].
在顶级表达式中使用时(即在任何函数之外), 回来吧 导致整个当前顶级表达式提前终止。
# *`做`*-密码_
do
创建一个匿名函数并将其作为第一个参数传递给函数调用。 例如:
map(1:10) do x
2x
end
相当于 地图(x->2x,1:10).
像这样使用多个参数:
map(1:10, 11:20) do x, y
x + y
end
# *`開始啦。`*-密码_
begin
开始。..结束 表示代码块。
begin
println("Hello, ")
println("World!")
end
開始啦。 索引时也可以用来表示集合的第一个索引或数组的维数的第一个索引。 例如, a[开始] 是数组的第一个元素 a.
|
兼容性
Julia1.4使用 |
*例子*
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> A[begin, :]
2-element Matrix{Int64}:
1
2
# *`让`*-密码_
let
让 块创建一个新的硬作用域,并可选地引入新的本地绑定。
就像 其他范围构造, 让 块定义新引入的局部变量可访问的代码块。 此外,该语法对于逗号分隔的赋值和变量名具有特殊含义,这些变量名可以选择性地出现在与 让:
let var1 = value1, var2, var3 = value3
code
end
这一行引入的变量是本地的 让 块和赋值按顺序计算,每个右侧在作用域中计算,而不考虑左侧的名称。 因此,写一些像这样的东西是有意义的 设x=x,自二 x 变量是不同的,左侧局部阴影 x 从外部范围。 这甚至是一个有用的习惯用法,因为每次输入局部范围时都会新创建新的局部变量,但这只有在通过闭包超出其范围的变量的情况下才能观察到。 A 让 没有赋值的变量,例如 var2 在上面的示例中,声明了一个尚未绑定到值的新局部变量。
相比之下, 開始啦。块还将多个表达式组合在一起,但不引入范围或具有特殊的赋值语法。
*例子*
在下面的函数中,有一个单 x 这是迭代更新三次由 地图. 闭包返回了所有引用 x 在其最终价值:
julia> function test_outer_x()
x = 0
map(1:3) do _
x += 1
return ()->x
end
end
test_outer_x (generic function with 1 method)
julia> [f() for f in test_outer_x()]
3-element Vector{Int64}:
3
3
3
但是,如果我们添加一个 让 引入_new_局部变量的块我们最终将捕获三个不同的变量(每次迭代一个),即使我们选择使用(阴影)相同的名称。
julia> function test_let_x()
x = 0
map(1:3) do _
x += 1
let x = x
return ()->x
end
end
end
test_let_x (generic function with 1 method)
julia> [f() for f in test_let_x()]
3-element Vector{Int64}:
1
2
3
所有引入新局部变量的范围构造在重复运行时都以这种方式运行; 让 它是否有能力简洁地宣布新的 本地可能会影响同名外部变量的s。 例如,直接使用 做 函数类似地捕获三个不同的变量:
julia> function test_do_x()
map(1:3) do x
return ()->x
end
end
test_do_x (generic function with 1 method)
julia> [f() for f in test_do_x()]
3-element Vector{Int64}:
1
2
3
# *`如果`*-密码_
if/elseif/else
如果/埃尔塞夫/其他 执行条件求值,这允许根据布尔表达式的值对代码部分进行求值或不求值。 以下是 如果/埃尔塞夫/其他 条件语法:
if x < y
println("x is less than y")
elseif x > y
println("x is greater than y")
else
println("x is equal to y")
end
如果条件表达式 x<y 为真,则计算相应的块;否则条件表达式 x>y 被评估,如果为真,则对相应的块进行评估;如果两个表达式都不为真,则 其他 块进行评估。 该 埃尔塞夫 和 其他 块是可选的,并且尽可能多 埃尔塞夫 可以使用所需的块。
与其他一些语言相反,条件必须是类型的 布尔. 条件可转换为 布尔.
julia> if 1 end
ERROR: TypeError: non-boolean (Int64) used in boolean context
# *`而`*-密码_
while
而 循环重复计算条件表达式,并继续计算while循环的主体,只要表达式保持为真。 如果第一次到达while循环时条件表达式为false,则永远不会计算主体。
*例子*
julia> i = 1
1
julia> while i < 5
println(i)
global i += 1
end
1
2
3
4
# *`休息`*-密码_
break
立即跳出一个循环。
*例子*
julia> i = 0
0
julia> while true
global i += 1
i > 5 && break
println(i)
end
1
2
3
4
5
# *`继续`*-密码_
continue
跳过当前循环迭代的其余部分。
*例子*
julia> for i = 1:6
iseven(i) && continue
println(i)
end
1
3
5
# *`试试`*-密码_
try/catch
A 试试/渔获 语句允许拦截错误(异常)抛出 投掷以便程序执行可以继续。 例如,下面的代码尝试写入一个文件,但警告用户,并继续,而不是终止执行,如果文件无法写入:
try
open("/danger", "w") do f
println(f, "Hello")
end
catch
@warn "Could not write file."
end
或者,当文件无法读入变量时:
lines = try
open("/danger", "r") do f
readlines(f)
end
catch
@warn "File not found."
end
语法 捉e (哪里 e 是任何变量)将抛出的异常对象分配给给定的变量内 渔获 块。
的力量 试试/渔获 构造在于能够将深度嵌套的计算立即展开到调用函数堆栈中更高的级别。
A 尝试/捕捉 块也可以有一个 其他 仅在未发生异常时执行的子句:
try
a_dangerous_operation()
catch
@warn "The operation failed."
else
@info "The operation succeeded."
end
A 试试 或 试试/渔获 块也可以有一个 最后 结束时执行的子句,而不管是否发生异常。 例如,这可以用来保证打开的文件被关闭:
f = open("file")
try
operate_on_file(f)
catch
@warn "An error occurred!"
finally
close(f)
end
(最后 也可以在没有 渔获 块。)
|
兼容性
Julia1.8Else子句至少需要Julia1.8。 |
# *`本地`*-密码_
local
本地 引入一个新的局部变量。 查看 关于变量范围的手册部分以获取更多信息。
*例子*
julia> function foo(n)
x = 0
for i = 1:n
local x # introduce a loop-local x
x = i
end
x
end
foo (generic function with 1 method)
julia> foo(10)
0
# *`全球`*-密码_
global
全球x 使 x 在当前作用域及其内部作用域中,引用该名称的全局变量。 查看 关于变量范围的手册部分以获取更多信息。
*例子*
julia> z = 3
3
julia> function foo()
global z = 6 # use the z variable defined outside foo
end
foo (generic function with 1 method)
julia> foo()
6
julia> z
6
# *`外,外`*-密码_
for outer
重用现有的局部变量,以便在 为 循环。
查看 关于变量范围的手册部分以获取更多信息。
请参阅 为.
*例子*
julia> function f()
i = 0
for i = 1:3
# empty
end
return i
end;
julia> f()
0
julia> function f()
i = 0
for outer i = 1:3
# empty
end
return i
end;
julia> f()
3
julia> i = 0 # global variable
for outer i = 1:3
end
ERROR: syntax: no outer local variable declaration exists for "for outer"
[...]
# *`康斯特`*-密码_
const
康斯特 用于声明值不会更改的全局变量。 在几乎所有代码(特别是性能敏感的代码)中,全局变量都应该以这种方式声明为常量。
const x = 5
可以在单个变量中声明多个变量 康斯特:
const y, z = 7, 11
请注意 康斯特 只适用于一个 = 操作,因此 const x=y=1 声明 x 保持不变,但不是 y. 另一方面, const x=const y=1 声明两者 x 和 y 不变。
请注意,"constant-ness"不会扩展到可变容器中;只有变量与其值之间的关联是常量。 如果 x 是数组或字典(例如),您仍然可以修改,添加或删除元素。
在某些情况下,更改a的值 康斯特 变量给出警告而不是错误。 但是,这可能会产生不可预测的行为或破坏程序的状态,因此应该避免。 此功能仅用于方便交互使用。
# *`基地。@kwdef`*-马科罗_
@kwdef typedef
这是一个帮助器宏,它自动为表达式中声明的类型定义基于关键字的构造函数 打字,打字,这必须是一个 结构体 或 可变结构 表达。 默认参数是通过声明表单的字段来提供的 字段::T=默认值 或 字段=默认值. 如果未提供默认值,则关键字参数将成为结果类型构造函数中的必需关键字参数。
内部构造函数仍然可以定义,但至少有一个应该接受与默认内部构造函数相同形式的参数(即每个字段一个位置参数),以便与关键字外部构造函数正确
|
兼容性
朱莉娅1.1 |
|
兼容性
Julia1.9此宏从Julia1.9导出。 |
*例子*
julia> @kwdef struct Foo
a::Int = 1 # specified default
b::String # required keyword
end
Foo
julia> Foo(b="hi")
Foo(1, "hi")
julia> Foo()
ERROR: UndefKeywordError: keyword argument `b` not assigned
Stacktrace:
[...]
# *`哪里`*-密码_
where
变量绑定默认为 任何如果省略:
Vector{T} where T # short for `where T<:Any`
变量也可以有下限:
Vector{T} where T>:Int
Vector{T} where Int<:T<:Real
嵌套还有一个简洁的语法 哪里 表情。 例如,这:
Pair{T, S} where S<:Array{T} where T<:Number
可缩短至:
Pair{T, S} where {T<:Number, S<:Array{T}}
这种形式通常在方法签名上找到。
请注意,在这种形式中,变量首先列在最外层。 这与使用语法将类型"应用"到参数值时替换变量的顺序相匹配 T{p1, p2, ...}.
# *`...`*-密码_
...
"Splat"操作员, ...,表示参数序列。 ... 可用于函数定义,以指示函数接受任意数量的参数。 ... 也可用于将函数应用于参数序列。
*例子*
julia> add(xs...) = reduce(+, xs)
add (generic function with 1 method)
julia> add(1, 2, 3, 4, 5)
15
julia> add([1, 2, 3]...)
6
julia> add(7, 1:100..., 1000:1100...)
111107
# *`=`*-密码_
=
= 是赋值运算符。
*对于变量 a 和表达 b, a=b 使 a 参考的值 b.
*对于功能 f(x), f(x)=x 定义一个新的函数常量 f,或者将新方法添加到 f 如果 f 已定义;此用法等效于 函数f(x);x;结束.
* a[i]=v 电话 (a,v,i).
* a.b=c 电话 xref:base/base.adoc#Base.setproperty!(a,:b,c).
*函数调用内部, f(a=b) 通行证 b 作为关键字参数的值 a.
*带逗号的括号内, (a=1,) 构造a xref:base/base.adoc#Core.NamedTuple" class="xref page">命名的,命名的.
*例子*
julia> b = [1]; a = b; b[1] = 2; a
1-element Vector{Int64}:
2
julia> b = [1]; a = copy(b); b[1] = 2; a
1-element Vector{Int64}:
1
传递给函数的集合也不会被复制。 函数可以修改(改变)其参数引用的对象的内容。 (执行此操作的函数的名称通常以'!'.)
julia> function f!(x); x[:] .+= 1; end
f! (generic function with 1 method)
julia> a = [1]; f!(a); a
1-element Vector{Int64}:
2
赋值可以并行地对多个变量进行操作,从可迭代的变量中获取值:
julia> a, b = 4, 5
(4, 5)
julia> a, b = 1:3
1:3
julia> a, b
(1, 2)
赋值可以对串联的多个变量进行操作,并将返回最右边的表达式的值:
julia> a = [1]; b = [2]; c = [3]; a = b = c
1-element Vector{Int64}:
3
julia> b[1] = 2; a, b, c
([2], [2], [2])
julia> a = [1, 1]; a[3] = 2
ERROR: BoundsError: attempt to access 2-element Vector{Int64} at index [3]
[...]
julia> push!(a, 2, 3)
4-element Vector{Int64}:
1
1
2
3
分配;分配 [] 不从集合中消除元素;而是使用 过滤器!.
julia> a = collect(1:3); a[a .<= 1] = []
ERROR: DimensionMismatch: tried to assign 0 elements to 1 destinations
[...]
julia> filter!(x -> x > 1, a) # in-place & thus more efficient than a = a[a .> 1]
2-element Vector{Int64}:
2
3
# *`?:`*-密码_
a ? b : c
条件的简短形式;阅读"如果 a,评估 b 否则评估 c". 也称为https://en.wikipedia.org/wiki/%3F:[三元运算符]。
此语法等效于 如果a;b;c结束,但经常被用来强调价值 b-或-c 它被用作更大表达式的一部分,而不是评估的副作用 b 或 c 可能有。
请参阅手册部分 控制流程了解更多详情。
*例子*
julia> x = 1; y = 2;
julia> x > y ? println("x is larger") : println("x is not larger")
x is not larger
julia> x > y ? "x is larger" : x == y ? "x and y are equal" : "y is larger"
"y is larger"
# *`.=`*-密码_
.=
执行广播分配。 右边的参数被扩展为 广播然后就地分配到左侧参数中。 与同一表达式中的其他虚线运算符融合;即整个赋值表达式转换为单个循环。
A.=B 类似于 广播!(身份,A,B).
*例子*
julia> A = zeros(4, 4); B = [1, 2, 3, 4];
julia> A .= B
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
2.0 2.0 2.0 2.0
3.0 3.0 3.0 3.0
4.0 4.0 4.0 4.0
julia> A
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
2.0 2.0 2.0 2.0
3.0 3.0 3.0 3.0
4.0 4.0 4.0 4.0
# *`::`*-密码_
::
该 :: operator要么声明值具有给定类型,要么声明局部变量或函数返回始终具有给定类型。
给出 表达式::T, 表达方式 首先进行评估。 如果结果是类型 T,值简单返回。 否则,一个 打字错误被抛出。
在局部作用域中,语法 本地x::T 或 x::T=表达式 声明该局部变量 x 总是有类型 T. 当一个值被赋给变量时,它将被转换为类型 T 通过调用 转换/转换.
在方法声明中,语法 函数f(x)::T 导致方法返回的任何值转换为类型 T.
请参阅手册部分 类型声明。
*例子*
julia> (1+2)::AbstractFloat
ERROR: TypeError: typeassert: expected AbstractFloat, got a value of type Int64
julia> (1+2)::Int
3
julia> let
local x::Int
x = 2.0
x
end
2
标准模块
# *`主要`*-模式_
Main
主要 是顶层模块,Julia从 主要 置为当前模块。 在提示符下定义的变量进入 主要,而 varinfo的 列出变量 主要.
julia> @__MODULE__
Main
基本子模块
所有对象
# *`核心。:===`*-函数
===(x,y) -> Bool
≡(x,y) -> Bool
确定是否 x 和 y 它们是相同的,因为没有程序可以区分它们。 首先是 x 和 y 进行比较。 如果它们是相同的,则可变对象按内存中的地址进行比较,不可变对象(如数字)按位级别的内容进行比较。 这个功能有时被称为"egal"。 它总是返回一个 布尔 价值。
*例子*
julia> a = [1, 2]; b = [1, 2];
朱莉娅>a==b
真的
朱莉娅>a===b
错误
朱莉娅>a===a
真的
# *`核心。伊萨`*-函数
isa(x, type) -> Bool
确定是否 x 是给定的 类型. 也可以用作中缀运算符,例如 x isa类型.
*例子*
julia> isa(1, Int)
true
julia> isa(1, Matrix)
false
julia> isa(1, Char)
false
julia> isa(1, Number)
true
julia> 1 isa Number
true
# *`基地。等效;等效`*-函数
isequal(x)
创建一个函数,将其参数与 x 使用 等效;等效,即等价于 y->等距(y,x).
返回的函数是类型 基地。修正2{typeof(isequal)},从而可用于实施专门的方法。
isequal(x, y) -> Bool
等效;等效 是一个等价关系-它是反身的(=== 暗示 等效;等效),对称(等效(a,b) 暗示 等效(b,a))和传递性(等效(a,b) 和 等效(b,c) 暗示 等效(a,c)).
*实施*
的默认实现 等效;等效 电话 ==,所以不涉及浮点值的类型一般只需要定义 ==.
等效;等效 是哈希表使用的比较函数(Dict,Dict). 等距(x,y) 必须暗示 哈希(x)==哈希(y).
这通常意味着自定义的类型 == 或 等效;等效 方法存在必须实现相应的 哈希方法(反之亦然)。 集合通常实现 等效;等效 通过调用 等效;等效 递归地对所有内容。
此外, 等效;等效 与 无为,并且它们一起工作以定义一个固定的总排序,其中恰好一个 等距(x,y), isless(x,y),或 isless(y,x) 必须是 真的 (而另外两个 错误).
标量类型一般不需要实现 等效;等效 与…… ==,除非它们表示比作为通用后备提供的更有效实现的浮点数(基于 伊斯南, n.信号,信号,而 ==).
*例子*
julia> isequal([1., NaN], [1., NaN])
true
julia> [1., NaN] == [1., NaN]
false
朱莉娅>0.0==-0.0
真的
julia>isequal(0.0,-0.0)
错误
julia>失踪==失踪
失踪
茱莉亚>isequal(漏,漏)
真的
# *`基地。无为`*-函数
isless(x, y)
测试是否 x 小于 y,根据固定的总顺序(与 等效;等效). 无障碍 没有为对定义 (x,y) 所有类型的。 但是,如果它被定义,则期望满足以下内容:
*如果 无量(x,y) 是定义的,那么也是 isless(y,x) 和 等距(x,y),而这三个产量中的一个 真的.
*定义的关系 无为 是传递性的,即, isless(x,y)&&isless(y,z) 暗示 isless(x,z).
通常无序的值,例如 南,在常规值之后排序。 失踪值排在最后。
这是由使用的默认比较 排序!.
*实施*
*例子*
julia> isless(1, 3)
true
julia> isless("Red", "Blue")
false
# *`基地。ifelse`*-函数
ifelse(condition::Bool, x, y)
回来吧 x 如果 条件 是 真的,否则返回 y. 这与 ? 或 如果 因为它是一个普通的函数,所以所有的参数都是首先计算的。 在某些情况下,使用 ifelse 而不是一个 如果 语句可以消除生成代码中的分支,并在紧密循环中提供更高的性能。
*例子*
julia> ifelse(1 > 2, 1, 2)
2
# *`核心。类型;类型`*-函数
typeof(x)
获取具体类型的 x.
请参阅 eltype,eltype.
*例子*
julia> a = 1//2;
julia> typeof(a)
Rational{Int64}
julia> M = [1 2; 3.5 4];
julia> typeof(M)
Matrix{Float64} (alias for Array{Float64, 2})
# *`基地。n.婴儿`*-函数
ntuple(f, ::Val{N})
创建一个长度元组 N,计算每个元素为 f(i),在哪里 i 是元素的索引。 通过采取 瓦尔(N) 因此,ntuple的此版本可能会生成比将长度作为整数的版本更有效的代码。 但是 ntuple(f,N) 优选为 ntuple(f,Val(N)) 在以下情况下 N 无法在编译时确定。
*例子*
julia> ntuple(i -> 2*i, Val(4))
(2, 4, 6, 8)
ntuple(f, n::Integer)
创建一个长度元组 n,计算每个元素为 f(i),在哪里 i 是元素的索引。
*例子*
julia> ntuple(i -> 2*i, 4)
(2, 4, 6, 8)
# *`基地。哈希`*-函数
hash(x[, h::UInt]) -> UInt
计算一个整数哈希码,以便 等距(x,y) 暗示 哈希(x)==哈希(y). 可选的第二个参数 h 是要与结果混合的另一个哈希码。
当启动新的Julia进程时,哈希值可能会发生变化。
julia> a = hash(10)
0x95ea2955abd45275
julia> hash(10, a) # only use the output of another hash function as the second argument
0xd42bad54a8575b16
# *`基地。终结器,终结器`*-函数
finalizer(f, x)
注册函数 f(x) 当没有程序可访问的引用时被调用 x,并返回 x. 的类型 x 必须是一个 可变结构,否则函数会抛出。
f 不能导致任务切换,这排除了大多数I/O操作,例如 打印,打印. 使用 @异步 宏(将上下文切换推迟到终结器之外)或 ccall 在C中直接调用IO函数可能有助于调试目的。
请注意,没有保证执行的世界年龄 f. 它可以在终结者注册的世界时代或任何以后的世界时代被调用。
*例子*
finalizer(my_mutable_struct) do x
@async println("Finalizing $x.")
end
终结器(my_mutable_struct)做x
ccall(:jl_safe_printf,Cvoid,(Cstring,Cstring),"Finalizing%s.",repr(x))
结束
终结器可以在对象构造中注册。 在下面的示例中,请注意,我们隐式依赖于终结器返回新创建的可变结构 x.
mutable struct MyMutableStruct
bar
function MyMutableStruct(bar)
x = new(bar)
f(t) = @async println("Finalizing $t.")
finalizer(f, x)
end
end
# *`基地。深镜,深镜`*-函数
deepcopy(x)
创建一个深度副本 x:所有内容都是递归复制的,从而产生一个完全独立的对象。 例如,深度复制数组会创建它包含的所有对象的深度副本,并生成具有一致关系结构的新数组(例如,如果前两个元素在原始数组中是相同的对象,则新数组 深镜,深镜ed对象)。 打电话来 深镜,深镜 在对象上通常应该具有与序列化然后反序列化相同的效果。
虽然通常不需要,但用户定义的类型可以复盖默认值 深镜,深镜 通过定义函数的专用版本的行为 deepcopy_internal(x::T,dict::IdDict) (否则不应该使用),在哪里 T 是要专门用于的类型,并且 dict,dict 跟踪递归中到目前为止复制的对象。 内的定义, [医]内切 应用于代替 深镜,深镜,而 dict,dict 在返回之前,应酌情更新变量。
# *`基地。获得财产`*-函数
getproperty(value, name::Symbol)
getproperty(value, name::Symbol, order::Symbol)
语法 a.b 电话 getproperty(a,:b). 语法 @原子序a.b 电话 getproperty(a,:b,:order) 和语法 @原子a.b 电话 getproperty(a,:b,:sequentially_consistent).
*例子*
julia> struct MyType{T <: Number}
x::T
end
julia> function Base.getproperty(obj::MyType, sym::Symbol)
if sym === :special
return obj.x + 1
else # fallback to getfield
return getfield(obj, sym)
end
end
julia> obj = MyType(1);
julia> obj.special
2
julia> obj.x
1
一个人应该超载 获得财产 只有在必要时,因为如果语法的行为可能会令人困惑 反对。f 是不寻常的。 还要注意,使用方法通常是优选的。 有关更多信息,请参阅此样式指南文档: 首选导出方法而不是直接字段访问。
请参阅 盖菲尔德, 财产名称和 setproperty!.
# *`基地。setproperty!`*-函数
setproperty!(value, name::Symbol, x)
setproperty!(value, name::Symbol, x, order::Symbol)
语法 a.b=c 电话 setproperty!(a,:b,c). 语法 @原子序a.b=c 电话 setproperty!(a,:b,c,:顺序) 和语法 @原子a.b=c 电话 setproperty!(a,:b,c,:sequentially_consistent).
|
兼容性
朱莉娅1.8 |
# *`基地。更换产品!`*-函数
replaceproperty!(x, f::Symbol, expected, desired, success_order::Symbol=:not_atomic, fail_order::Symbol=success_order)
执行比较和交换操作 x.f 从 预期的 到 期望的,每个egal。 语法 @atomicreplace x.f期望=>期望 可以用来代替函数调用形式。
请参阅 替换场! setproperty!, setpropertyonce!.
# *`基地。swapproperty!`*-函数
swapproperty!(x, f::Symbol, v, order::Symbol=:not_atomic)
语法 @原子a.b,_=c,a.b 申报表 (c,swapproperty!(a,:b,c,:sequentially_consistent)),那里必须有一个 获得财产 双方共同的表达。
请参阅 斯瓦普菲尔德!和 setproperty!.
# *`基地。modifyproperty!`*-函数
modifyproperty!(x, f::Symbol, op, v, order::Symbol=:not_atomic)
语法 @原子op(x.f,v) (及其等价物 @原子x.f op v)回报 modifyproperty!(x,:f,op,v,:sequentially_consistent),其中第一个参数必须是 获得财产 表达并且被原子修饰。
调用 op(getproperty(x,f),v) 必须返回可存储在字段中的值 f 对象的 x 默认情况下。 特别是,与默认行为不同 setproperty!,该 转换/转换 函数不会自动调用。
请参阅 莫迪菲尔德!和 setproperty!.
# *`基地。setpropertyonce!`*-函数
setpropertyonce!(x, f::Symbol, value, success_order::Symbol=:not_atomic, fail_order::Symbol=success_order)
执行比较和交换操作 x.f 要将其设置为 价值 如果以前未设置。 语法 @atomiconce x.f=值 可以用来代替函数调用形式。
请参阅 setfieldonce!, setproperty!, 更换产品!.
|
兼容性
Julia1.11此功能需要Julia1.11或更高版本。 |
# *`基地。财产名称`*-函数
propertynames(x, private=false)
获取属性的元组或向量(x.财产)的对象 x. 这通常与 字段名(类型(x)),但是重载的类型 获得财产一般应超载 财产名称 以及获取类型的实例的属性。
财产名称(x) 可能只返回"公共"属性名称,这些名称是 x. 如果您希望它也返回用于内部使用的"私有"属性名称,请传递 真的 对于可选的第二个参数。 REPL标签完成 x. 只显示 私人=错误 属性。
# *`核心。盖菲尔德`*-函数
getfield(value, name::Symbol, [order::Symbol])
getfield(value, i::Int, [order::Symbol])
从复合中提取字段 价值 按姓名或职位。 或者,可以为操作定义排序。 如果该字段被宣布 @原子,强烈建议规范与该位置的商店兼容。 否则,如果未声明为 @原子,此参数必须为 :not_atomic 如果指定。 请参阅 获得财产和 字段名称.
*例子*
julia> a = 1//2
1//2
julia> getfield(a, :num)
1
julia> a.num
1
julia> getfield(a, 1)
1
# *`核心。塞特菲尔德!`*-函数
setfield!(value, name::Symbol, x, [order::Symbol])
setfield!(value, i::Int, x, [order::Symbol])
分配;分配 x 到一个命名字段 价值 复合型。 该 价值 必须是可变的和 x 必须是 fieldtype(typeof(value),name). 此外,还可以为此操作指定排序。 如果该字段被宣布 @原子,本规范是强制性的。 否则,如果未声明为 @原子,它必须是 :not_atomic 如果指定。 请参阅 setproperty!.
*例子*
julia> mutable struct MyMutableStruct
field::Int
end
julia> a = MyMutableStruct(1);
julia> setfield!(a, :field, 2);
julia> getfield(a, :field)
2
julia> a = 1//2
1//2
julia> setfield!(a, :num, 3);
ERROR: setfield!: immutable struct of type Rational cannot be changed
# *`核心。莫迪菲尔德!`*-函数
modifyfield!(value, name::Symbol, op, x, [order::Symbol]) -> Pair
modifyfield!(value, i::Int, op, x, [order::Symbol]) -> Pair
在应用函数后,原子地执行获取和设置字段的操作 op的.
y = getfield(value, name)
z = op(y, x)
setfield!(value, name, z)
return y => z
如果硬件支持(例如,原子增量),这可能被优化到适当的硬件指令,否则它将使用循环。
|
兼容性
Julia1.7此功能需要Julia1.7或更高版本。 |
# *`核心。替换场!`*-函数
replacefield!(value, name::Symbol, expected, desired,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> (; old, success::Bool)
replacefield!(value, i::Int, expected, desired,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> (; old, success::Bool)
原子地执行操作以获取并有条件地将字段设置为给定值。
y = getfield(value, name, fail_order)
ok = y === expected
if ok
setfield!(value, name, desired, success_order)
end
return (; old = y, success = ok)
如果硬件支持,这可能会优化到适当的硬件指令,否则它将使用循环。
|
兼容性
Julia1.7此功能需要Julia1.7或更高版本。 |
# *`核心。斯瓦普菲尔德!`*-函数
swapfield!(value, name::Symbol, x, [order::Symbol])
swapfield!(value, i::Int, x, [order::Symbol])
原子地执行操作以同时获取和设置字段:
y = getfield(value, name)
setfield!(value, name, x)
return y
|
兼容性
Julia1.7此功能需要Julia1.7或更高版本。 |
# *`核心。setfieldonce!`*-函数
setfieldonce!(value, name::Union{Int,Symbol}, desired,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> success::Bool
原子地执行将字段设置为给定值的操作,只有在以前未设置的情况下。
ok = !isdefined(value, name, fail_order)
if ok
setfield!(value, name, desired, success_order)
end
return ok
|
兼容性
Julia1.11此功能需要Julia1.11或更高版本。 |
# *`核心。被定义的`*-函数
isdefined(m::Module, s::Symbol, [order::Symbol])
isdefined(object, s::Symbol, [order::Symbol])
isdefined(object, index::Int, [order::Symbol])
测试是否定义了全局变量或对象字段。 参数可以是模块和符号,也可以是复合对象和字段名称(作为符号)或索引。 或者,可以为操作定义排序。 如果该字段被宣布 @原子,强烈建议规范与该位置的商店兼容。 否则,如果未声明为 @原子,此参数必须为 :not_atomic 如果指定。
要测试是否定义了数组元素,请使用 is分配代替。
支持全局变量变体以兼容较旧的julia版本。 对于新代码,首选 isdefinedglobal.
请参阅 @被定义.
*例子*
julia> isdefined(Base, :sum)
true
julia> isdefined(Base, :NonExistentMethod)
false
julia> a = 1//2;
julia> isdefined(a, 2)
true
julia> isdefined(a, 3)
false
julia> isdefined(a, :num)
true
julia> isdefined(a, :numerator)
false
# *`核心。isdefinedglobal`*-函数
isdefinedglobal(m::Module, s::Symbol, [allow_import::Bool=true, [order::Symbol=:unordered]])
测试是否全局变量 s 在模块中定义 m (在当前的世界时代)。 当且仅当可以从此全局变量读取值并且访问不会抛出时,才认为定义了变量。 这包括具有值集的常量和全局变量。
如果 允许_import 是 错误,全局变量必须在里面定义 m 并且可能不会从另一个模块导入。
|
兼容性
Julia1.12此功能需要Julia1.12或更高版本。 |
请参阅 @被定义.
*例子*
julia> isdefinedglobal(Base, :sum)
true
julia> isdefinedglobal(Base, :NonExistentMethod)
false
julia> isdefinedglobal(Base, :sum, false)
true
julia>isdefinedglobal(Main,:sum,false)
错误
# *`基地。@被定义`*-马科罗_
@isdefined s -> Bool
测试是否变量 s 在当前范围中定义。
*例子*
julia> @isdefined newvar
false
julia> newvar = 1
1
julia> @isdefined newvar
true
julia> function f()
println(@isdefined x)
x = 3
println(@isdefined x)
end
f (generic function with 1 method)
julia> f()
false
true
# *`基地。转换/转换`*-函数
convert(T, x)
转换/转换 x 到类型的值 T.
*例子*
julia> convert(Int, 3.0)
3
julia> convert(Int, 3.5)
ERROR: InexactError: Int64(3.5)
Stacktrace:
[...]
如果 T 是一个 [医抽象浮]类型,然后它将返回最接近的值 x 可由 T. Inf被视为大于一个ulp 最大浮标(T) 为确定最近的目的。
julia> x = 1/3
0.3333333333333333
julia> convert(Float32, x)
0.33333334f0
julia> convert(BigFloat, x)
0.333333333333333314829616256247390992939472198486328125
如果 T 是集合类型和 x 一个集合,结果 转换(T,x) 可以别名全部或部分 x.
julia> x = Int[1, 2, 3];
julia> y = convert(Vector{Int}, x);
julia> y === x
true
# *`基地。推广`*-函数
promote(xs...)
将所有参数转换为通用类型,并将它们全部返回(作为元组)。 如果不能转换参数,则会引发错误。
请参阅: promote_type, 促进/促进.
*例子*
julia> promote(Int8(1), Float16(4.5), Float32(4.1))
(1.0f0, 4.5f0, 4.1f0)
julia> promote_type(Int8, Float16, Float32)
Float32
julia> reduce(Base.promote_typejoin, (Int8, Float16, Float32))
Real
julia> promote(1, "x")
ERROR: promotion of types Int64 and String failed to change any arguments
[...]
julia> promote_type(Int, String)
Any
# *`基地。类型,类型`*-函数
oftype(x, y)
转换/转换 y 到的类型 x 即 转换(类型(x),y).
*例子*
julia> x = 4;
julia> y = 3.;
julia> oftype(x, y)
3
julia> oftype(y, x)
4.0
# *`基地。加宽`*-函数
widen(x)
如果 x 是一个类型,返回一个"较大"的类型,定义为使算术运算 + 和 - 保证对任何类型的值组合不会溢出或丢失精度 x 能撑住。
对于小于128位的固定大小整数类型, 加宽 将返回具有两倍位数的类型。
如果 x 是一个值,它被转换为 加宽(x型).
*例子*
julia> widen(Int32)
Int64
julia> widen(1.5f0)
1.5
# *`核心。弱href`*-类型
WeakRef(x)
w=WeakRef(x) 构造a 弱引用到Julia值 x:虽然 w 包含对 x,它不会阻止 x 从垃圾收集。 w.价值 是要么 x (如果 x 尚未被垃圾回收)或 什么都没有 (如果 x 已被垃圾回收)。
julia> x = "a string"
"a string"
julia> w = WeakRef(x)
WeakRef("a string")
julia> GC.gc()
julia> w # a reference is maintained via `x`
WeakRef("a string")
julia> x = nothing # clear reference
julia> GC.gc()
julia> w
WeakRef(nothing)
类型的属性
类型关系
# *`核心。类型`*-类型
Core.Type{T}
核心。类型 是一个抽象类型,它具有所有类型对象作为其实例。 单例类型的唯一实例 核心。类型{T} 是对象 T.
*例子*
julia> isa(Type{Float64}, Type)
true
julia> isa(Float64, Type)
true
julia> isa(Real, Type{Float64})
false
julia> isa(Real, Type{Real})
true
# *`核心。数据类型`*-类型
DataType <: Type{T}
数据类型 表示具有名称、显式声明的超类型以及(可选)参数的显式声明类型。 系统中的每个具体值都是一些值的一个实例 数据类型.
*例子*
julia> typeof(Real)
DataType
julia> typeof(Int)
DataType
julia> struct Point
x::Int
y
end
julia> typeof(Point)
DataType
# *`核心。:<:`*-函数
<:(T1, T2)::Bool
子类型关系,在两种类型之间定义。 在朱莉娅,一个类型 S 被认为是一个类型的_subtype_ T 当且仅当我们有 S<:T.
适用于任何类型 L 和任何类型 R, L<:R 暗示任何价值 v 类型 L 也是类型 R. 即。, (L<:R)&&(v isa L) 暗示 v isa R.
子类型关系是_partial order_。 即。, <: 是:
*_reflexive_:对于任何类型 T, T<:T 持有
*_antisymmetric_:适用于任何类型 A 和任何类型 B, (A<:B)&&(B<:A) 暗示 A==B
*_transitive_:适用于任何类型 A,任何类型 B 和任何类型 C; (A<:B)&&(B<:C) 暗示 A<:C
*例子*
julia> Float64 <: AbstractFloat
true
julia> Vector{Int} <: AbstractArray
true
julia> Matrix{Float64} <: Matrix{AbstractFloat} # `Matrix` is invariant
false
julia> Tuple{Float64} <: Tuple{AbstractFloat} # `Tuple` is covariant
true
julia> Union{} <: Int # The bottom type, `Union{}`, subtypes each type.
true
julia>Union{}<:Float32<:AbstractFloat<:Real<:Number<:Any#Operator chaining
真的
该 <: 关键字也有几种语法用法,它们表示相同的子类型关系,但不执行运算符或返回Bool:
# *`基地。[医]打字`*-函数
typejoin(T, S, ...)
返回类型的最接近的共同祖先 T 和 S,即它们都继承的最窄类型。 在额外的varargs上递归。
*例子*
julia> typejoin(Int, Float64)
Real
julia> typejoin(Int, Float64, ComplexF32)
Number
# *`基地。打字机,打字机`*-函数
typeintersect(T::Type, S::Type)
计算包含 T 和 S. 通常这将是最小的这种类型或接近它的类型。
保证确切行为的特殊情况:当 T<:S, typeintersect(S,T)==T==typeintersect(T,S).
# *`基地。promote_type`*-函数
promote_type(type1, type2, ...)
提升是指将混合类型的值转换为单个通用类型。 promote_type 表示当运算符(通常是数学运算符)被赋予不同类型的参数时,Julia中的默认提升行为。 promote_type 通常尝试返回一个类型,该类型至少可以近似任何输入类型的大多数值,而不会过度扩展。 一些损失是可以容忍的;例如, promote_type(Int64,Float64) 申报表 漂浮64尽管严格,不是全部 Int64值可以完全表示为 漂浮64 价值观。
*例子*
julia> promote_type(Int64, Float64)
Float64
julia> promote_type(Int32, Int64)
Int64
julia> promote_type(Float32, BigInt)
BigFloat
julia>promote_type(Int16,Float16)
漂浮物16
julia>promote_type(Int64,Float16)
漂浮物16
julia>promote_type(Int8,UInt16)
UInt16
|
不要直接重载它来重载你自己的类型,你应该重载 |
# *`基地。n.促进,促进`*-函数
promote_typejoin(T, S)
计算包含两者的类型 T 和 S,可以是两种类型的父项,也可以是 工会 如果合适的话。 回落到 [医打字].
请参阅 推广, promote_type.
*例子*
julia> Base.promote_typejoin(Int, Float64)
Real
julia> Base.promote_type(Int, Float64)
Float64
# *`基地。isdispatchtuple,isdispatchtuple`*-函数
isdispatchtuple(T)
确定是否类型 T 是一个具体类型的元组,这意味着它可以在dispatch中显示为类型签名,并且没有可能出现在调用中的子类型(或超类型)。 如果 T 不是类型,则返回 错误.
申报结构
# *`基地。ismutabletype,ismutabletype`*-函数
ismutabletype(T) -> Bool
确定是否类型 T 被声明为可变类型(即使用 可变结构 关键字)。 如果 T 不是类型,则返回 错误.
|
兼容性
Julia1.7此功能至少需要Julia1.7。 |
# *`基地。[医]伊莎斯特拉克特型`*-函数
isabstracttype(T)
确定是否类型 T 被声明为抽象类型(即使用 抽象类型 语法)。 请注意,这不是否定 isconcretetype(T). 如果 T 不是类型,则返回 错误.
*例子*
julia> isabstracttype(AbstractArray)
true
julia> isabstracttype(Vector)
false
# *`基地。isprimitivetype,isprimitivetype`*-函数
isprimitivetype(T) -> Bool
确定是否类型 T 被声明为原始类型(即使用 原始类型 语法)。 如果 T 不是类型,则返回 错误.
# *`基地。issingletontype缧`*-函数
Base.issingletontype(T)
确定是否类型 T 只有一个可能的实例;例如,除了其他单例值之外没有字段的结构类型。 如果 T 不是具体类型,则返回 错误.
# *`基地。等结构类型`*-函数
isstructtype(T) -> Bool
确定是否类型 T 被声明为结构类型(即使用 结构体 或 可变结构 关键字)。 如果 T 不是类型,则返回 错误.
# *`基地。名称;名称`*-Method
nameof(t::DataType) -> Symbol
获取a的名称(可能 联合所有-包装) 数据类型 (没有其父模块)作为符号。
*例子*
julia> module Foo
struct S{T}
end
end
Foo
julia> nameof(Foo.S{T} where T)
:S
# *`基地。字段名`*-函数
fieldname(x::DataType, i::Integer)
获取字段的名称 i 一个 数据类型.
返回类型为 符号,除非当 x<:元组,在这种情况下,返回字段的索引,类型 Int型.
*例子*
julia> fieldname(Rational, 1)
:num
julia> fieldname(Rational, 2)
:den
julia> fieldname(Tuple{String,Int}, 2)
2
# *`核心。字段类型`*-函数
fieldtype(T, name::Symbol | index::Int)
确定复合数据类型中字段的声明类型(按名称或索引指定 T.
*例子*
julia> struct Foo
x::Int64
y::String
end
julia> fieldtype(Foo, :x)
Int64
julia> fieldtype(Foo, 2)
String
# *`基地。字段类型`*-函数
fieldtypes(T::Type)
复合数据类型中所有字段的声明类型 T 作为元组。
|
兼容性
Julia1.1此功能至少需要Julia1.1。 |
*例子*
julia> struct Foo
x::Int64
y::String
end
julia> fieldtypes(Foo)
(Int64, String)
# *`核心。nfields`*-函数
nfields(x) -> Int
获取给定对象中的字段数。
*例子*
julia> a = 1//2;
julia> nfields(a)
2
julia> b = 1
1
julia> nfields(b)
0
julia> ex = ErrorException("I've done a bad thing");
julia> nfields(ex)
1
在这些例子中, a 是一个 理性的,其中有两个字段。 b 是一个 Int型,这是一个根本没有字段的原始bitstype。 前 是一个 ErrorException异常,其中有一个字段。
# *`基地。伊斯康斯特`*-函数
isconst(t::DataType, s::Union{Int,Symbol}) -> Bool
确定字段是否 s 是const在给定的类型 t 从这个意义上说,从所述字段的读取对于平均对象是一致的。 特别要注意的是,在这个定义下,越界字段被认为是const(因为它们总是抛出)。
isconst(m::Module, s::Symbol) -> Bool
isconst(g::GlobalRef)
确定全局是否为 康斯特 在给定的模块 m,或者因为它被声明为常量,或者因为它是从常量绑定导入的。 请注意,constant-ness特定于一个特定的世界年龄,因此此函数的结果可能不会假定在世界年龄更新后成立。
# *`基地。isfieldatomic碌录潞陆`*-函数
isfieldatomic(t::DataType, s::Union{Int,Symbol}) -> Bool
确定字段是否 s 被声明 @原子 在给定的类型 t.
内存布局
# *`基地。大小;大小`*-Method
sizeof(T::DataType)
sizeof(obj)
给定的规范二进制表示的大小(以字节为单位) 数据类型 T,如果有的话。 或者对象的大小(以字节为单位) 反对 如果它不是一个 数据类型.
请参阅 基地。摘要大小.
*例子*
julia> sizeof(Float32)
4
julia> sizeof(ComplexF64)
16
julia> sizeof(1.0)
8
julia> sizeof(collect(1.0:10.0))
80
julia> struct StructWithPadding
x::Int64
flag::Bool
end
julia> sizeof(StructWithPadding) # not the sum of `sizeof` of fields due to padding
16
julia> sizeof(Int64) + sizeof(Bool) # different from above
9
如果 数据类型 T 没有特定大小,则抛出错误。
julia> sizeof(AbstractArray)
ERROR: Abstract type AbstractArray does not have a definite size.
Stacktrace:
[...]
# *`基地。[医]类型`*-函数
isconcretetype(T)
确定是否类型 T 是一个具体的类型,这意味着它可以有直接的实例(值) x 这样, 类型(x)===T). 请注意,这不是否定 isabstracttype(T). 如果 T 不是类型,则返回 错误.
*例子*
julia> isconcretetype(Complex)
false
julia> isconcretetype(Complex{Float32})
true
julia> isconcretetype(Vector{Complex})
true
julia> isconcretetype(Vector{Complex{Float32}})
true
julia> isconcretetype(Union{})
false
julia> isconcretetype(Union{Int,String})
false
# *`基地。等位类型`*-函数
isbitstype(T)
回来吧 真的 如果类型 T 是"纯数据"类型,这意味着它是不可变的,不包含对其他值的引用,仅 原始的 类型及其他 等位类型 类型。 典型的例子是数字类型,如 UInt8, 漂浮64,和 复杂{Float64}. 此类别类型很重要,因为它们作为类型参数有效,可能无法跟踪 被定义的 / is分配状态,并具有与C.if兼容的定义布局 T 不是类型,则返回 错误.
*例子*
julia> isbitstype(Complex{Float64})
true
julia> isbitstype(Complex)
false
# *`基地。菲尔德夫集`*-函数
fieldoffset(type, i)
字段的字节偏移量 i 相对于数据开始的类型。 例如,我们可以通过以下方式使用它来总结有关结构的信息:
julia> structinfo(T) = [(fieldoffset(T,i), fieldname(T,i), fieldtype(T,i)) for i = 1:fieldcount(T)];
julia> structinfo(Base.Filesystem.StatStruct)
14-element Vector{Tuple{UInt64, Symbol, Type}}:
(0x0000000000000000, :desc, Union{RawFD, String})
(0x0000000000000008, :device, UInt64)
(0x0000000000000010, :inode, UInt64)
(0x0000000000000018, :mode, UInt64)
(0x0000000000000020, :nlink, Int64)
(0x0000000000000028, :uid, UInt64)
(0x0000000000000030, :gid, UInt64)
(0x0000000000000038, :rdev, UInt64)
(0x0000000000000040, :size, Int64)
(0x0000000000000048, :blksize, Int64)
(0x0000000000000050, :blocks, Int64)
(0x0000000000000058, :mtime, Float64)
(0x0000000000000060, :ctime, Float64)
(0x0000000000000068, :ioerrno, Int32)
# *`基地。数据类型_对齐`*-函数
Base.datatype_alignment(dt::DataType) -> Int
此类型实例的内存分配最小对齐。 可以在任何调用 [医]类型,虽然对于内存它会给出元素的对齐,而不是整个对象。
# *`基地。数据类型_haspadding`*-函数
Base.datatype_haspadding(dt::DataType) -> Bool
返回此类型实例的字段是否在内存中打包,没有中间填充位(定义为其值不影响实例本身语义值的位)。 可以在任何调用 [医]类型.
# *`基地。datatype_pointerfree`*-函数
Base.datatype_pointerfree(dt::DataType) -> Bool
返回此类型的实例是否可以包含对gc托管内存的引用。 可以在任何调用 [医]类型.
特殊值
# *`基地。打字机`*-函数
typemin(T)
给定(真实)数字数据类型可表示的最低值 T.
*例子*
julia> typemin(Int8)
-128
julia> typemin(UInt32)
0x00000000
julia> typemin(Float16)
-Inf16
julia> typemin(Float32)
-Inf32
julia> nextfloat(-Inf32) # smallest finite Float32 floating point number
-3.4028235f38
# *`基地。[医]浮游生物`*-函数
floatmin(T = Float64)
返回浮点类型表示的最小正常数 T.
*例子*
julia> floatmin(Float16)
Float16(6.104e-5)
julia> floatmin(Float32)
1.1754944f-38
julia> floatmin()
2.2250738585072014e-308
# *`基地。每股收益`*-Method
eps(::Type{T}) where T<:AbstractFloat
eps()
返回浮点类型的_machine epsilon_ T (T=浮64 默认情况下)。 这被定义为1和下一个最大值之间的差距,由 类型(一(T)),并且相当于 eps(一(T)). (自 eps(T) 是对_relative error_的约束 T,它是一个"无量纲"量像 一个.)
*例子*
julia> eps()
2.220446049250313e-16
朱莉娅>eps(Float32)
1.1920929f-7
朱莉娅>1.0+eps()
1.0000000000000002
朱莉娅>1.0+eps()/2
1.0
# *`基地。每股收益`*-Method
eps(x::AbstractFloat)
返回最后一个位置的_unit_(ulp) x. 这是连续的可表示浮点值之间的距离 x. 在大多数情况下,如果在任一侧的距离 x 是不同的,则取两者中较大的,即
eps(x) == max(x-prevfloat(x), nextfloat(x)-x)
此规则的例外是最小和最大的有限值(例如 nextfloat(-Inf) 和 prevfloat(Inf) 为 漂浮64),其中四舍五入到较小的值。
这种行为的理由是 每股收益 限制浮点舍入误差。 默认情况下 RoundNearest拢潞 舍入模式,如果 是一个实数和 是最接近的浮点数 ,则
*例子*
julia> eps(1.0)
2.220446049250313e-16
julia> eps(prevfloat(2.0))
2.220446049250313e-16
julia> eps(2.0)
4.440892098500626e-16
julia> x = prevfloat(Inf) # largest finite Float64
1.7976931348623157e308
julia> x + eps(x)/2 # rounds up
Inf
julia> x + prevfloat(eps(x)/2) # rounds down
1.7976931348623157e308
# *`基地。实例`*-函数
instances(T::Type)
返回给定类型的所有实例的集合(如果适用)。 主要用于枚举类型(请参阅 @枚举).
*例子*
julia> @enum Color red blue green
julia> instances(Color)
(red, blue, green)
特殊类型
# *`核心。任何`*-类型
Any::DataType
任何 是所有类型的联合。 它具有定义属性 isa(X,Any)==真 对于任何 x. 任何 因此描述了可能值的整个宇宙。 例如 整数 是 任何 这包括 Int型, Int8,以及其他整数类型。
# *`核心。工会`*-类型
Union{Types...}
A 工会 类型是一个抽象类型,它包括它的任何参数类型的所有实例。 这意味着 T<:联合{T,S} 和 S<:联合{T,S}.
像其他抽象类型一样,它不能被实例化,即使它的所有参数都是非抽象的。
*例子*
julia> IntOrString = Union{Int,AbstractString}
Union{Int64, AbstractString}
julia> 1 isa IntOrString # instance of Int is included in the union
true
julia> "Hello!" isa IntOrString # String is also included
true
julia> 1.0 isa IntOrString # Float64 is not included because it is neither Int nor AbstractString
false
*扩展帮助*
与大多数其他参数类型不同,联合在其参数中是协变的。 例如, 工会{Real, String} 是 工会{Number, AbstractString}.
空虚的联盟 Union{}是朱莉娅的底部类型。
# *`联合{}`*-密码_
Union{}
工会{}, the empty Union of types, is the bottom type of the type system. That is, for each T::Type, Union{} <:T. 另请参阅子类型运算符的文档: <:.
因此, 工会{} is also an empty/uninhabited type, meaning that it has no values. That is, for each x, isa(x, Union{})==错误.
基地。底部 被定义为其别名和类型 联合{} 是 核心。[医]打字机.
*例子*
julia> isa(nothing, Union{})
false
julia> Union{} <: Int
true
julia> typeof(Union{}) === Core.TypeofBottom
true
julia> isa(Union{}, Union)
false
# *`核心。联合所有`*-类型
UnionAll
类型在类型参数的所有值上的联合。 联合所有 用于描述某些参数值未知的参数类型。 请参阅手册部分 UnionAll类型。
*例子*
julia> typeof(Vector)
UnionAll
julia> typeof(Vector{Int})
DataType
# *`核心。元组`*-类型
Tuple{Types...}
元组是一个固定长度的容器,可以保存任何不同类型的值,但不能被修改(它是不可变的)。 这些值可以通过索引访问。 元组字面量用逗号和括号书写:
julia> (1, 1+1)
(1, 2)
julia> (1,)
(1,)
julia> x = (0.0, "hello", 6*7)
(0.0, "hello", 42)
julia> x[2]
"hello"
julia> typeof(x)
Tuple{Float64, String, Int64}
长度-1元组必须用逗号书写, (1,),自 (1) 只是一个带括号的值。 () 表示空(长度-0)元组。
元组可以通过使用 元组 类型为构造函数:
julia> Tuple(["a", 1])
("a", 1)
julia> Tuple{String, Float64}(["a", 1])
("a", 1.0)
元组类型在其参数中是协变的: 元组{Int} 是 元组{Any}. 因此 元组{Any} 被认为是抽象类型,元组类型只有在它们的参数是具体的情况下才是具体的。 元组没有字段名称;字段只能通过索引访问。 元组类型可以具有任意数量的参数。
请参阅手册部分 元组类型。
# *`核心。命名的,命名的`*-类型
NamedTuple
命名的,命名的s是,正如他们的名字所暗示的,命名 元组`也就是说,它们是一个类似元组的值集合,其中每个条目都有一个唯一的名称,表示为 xref:base/base.adoc#Core.Symbol[`符号. 像 元组s, 命名的,命名的s是不可变的;名称和值都不能在构造后就地修改。
命名元组可以创建为带有键的元组字面值,例如 (a=1,b=2),或者作为一个元组字面量,在左括号后面加上分号,例如 (;a=1,b=2) (此表单也接受编程生成的名称,如下所述),或使用 命名的,命名的 类型为构造函数,例如 命名的,命名的{(:a, :b)}1,2.
访问命名元组中与名称关联的值可以使用字段访问语法完成,例如 x.a,或使用 getindex,getindex,例如 x[:a] 或 x[(:a,:b)]. 可以使用以下方法获得名称的元组 钥匙,并且可以使用以下方法获得值的元组 价值.
|
注释迭代结束 |
该 @NamedTuple宏可用于方便地声明 命名的,命名的 类型。
*例子*
julia> x = (a=1, b=2)
(a = 1, b = 2)
julia> x.a
1
julia> x[:a]
1
julia> x[(:a,)]
(a = 1,)
julia> keys(x)
(:a, :b)
julia> values(x)
(1, 2)
julia> collect(x)
2-element Vector{Int64}:
1
2
julia> collect(pairs(x))
2-element Vector{Pair{Symbol, Int64}}:
:a => 1
:b => 2
与如何以编程方式定义关键字参数类似,可以通过给出对来创建命名元组 名称::符号=>值 在元组字面量内的分号之后。 这个和 名称=值 语法可以混合:
julia> (; :a => 1, :b => 2, c=3)
(a = 1, b = 2, c = 3)
名称-值对也可以通过拆分命名元组或任何迭代器来提供,该迭代器生成两值集合,将每个符号作为第一个值:
julia> keys = (:a, :b, :c); values = (1, 2, 3);
julia> NamedTuple{keys}(values)
(a = 1, b = 2, c = 3)
julia> (; (keys .=> values)...)
(a = 1, b = 2, c = 3)
julia> nt1 = (a=1, b=2);
julia> nt2 = (c=3, d=4);
julia> (; nt1..., nt2..., b=20) # the final b overwrites the value from nt1
(a = 1, b = 20, c = 3, d = 4)
julia> (; zip(keys, values)...) # zip yields tuples such as (:a, 1)
(a = 1, b = 2, c = 3)
与关键字参数一样,标识符和点表达式意味着名称:
julia> x = 0
0
julia> t = (; x)
(x = 0,)
julia> (; t.x)
(x = 0,)
|
兼容性
Julia1.5标识符和点表达式的隐式名称从Julia1.5开始可用。 |
|
兼容性
Julia1.7使用 |
# *`基地。@NamedTuple`*-马科罗_
@NamedTuple{key1::Type1, key2::Type2, ...}
@NamedTuple begin key1::Type1; key2::Type2; ...; end
此宏为声明提供了更方便的语法 命名的,命名的 类型。 它返回一个 命名的,命名的 使用给定的键和类型键入,相当于 命名{(:key1, :key2, ...), Tuple{Type1,Type2,...}}. 如果 ::类型 声明被省略,它被认为是 任何. 该 开始。.. 结束 form允许声明被分割成多行(类似于 结构体 声明),但在其他方面是等价的。 该 命名的,命名的 打印时使用宏 命名的,命名的 类型,例如REPL。
例如,元组 (a=3.1,b="你好") 有一个类型 命名的,命名的{(:a, :b), Tuple{Float64, String}},也可以通过 @NamedTuple 作为:
julia> @NamedTuple{a::Float64, b::String}
@NamedTuple{a::Float64, b::String}
julia> @NamedTuple begin
a::Float64
b::String
end
@NamedTuple{a::Float64, b::String}
|
兼容性
Julia1.5这个宏从Julia1.5开始可用。 |
# *`基地。@夸格斯`*-马科罗_
@Kwargs{key1::Type1, key2::Type2, ...}
此宏提供了一种方便的方法来构造关键字参数的类型表示,其语法与 @NamedTuple. 例如,当我们有一个函数调用 func([位置参数];kw1=1.0,kw2="2"),我们可以使用这个宏来构造关键字参数的内部类型表示为 @夸格斯{kw1::Float64, kw2::String}. 宏语法专门用于在堆栈跟踪视图中打印关键字方法时简化其签名类型。
julia> @Kwargs{init::Int} # the internal representation of keyword arguments
Base.Pairs{Symbol, Int64, Nothing, @NamedTuple{init::Int64}}
julia> sum("julia"; init=1)
ERROR: MethodError: no method matching +(::Char, ::Char)
The function `+` exists, but no method is defined for this combination of argument types.
Closest candidates are:
+(::Any, ::Any, ::Any, ::Any...)
@ Base operators.jl:585
+(::Integer, ::AbstractChar)
@ Base char.jl:247
+(::T, ::Integer) where T<:AbstractChar
@ Base char.jl:237
Stacktrace:
[1] add_sum(x::Char, y::Char)
@ Base ./reduce.jl:24
[2] BottomRF
@ Base ./reduce.jl:86 [inlined]
[3] _foldl_impl(op::Base.BottomRF{typeof(Base.add_sum)}, init::Int64, itr::String)
@ Base ./reduce.jl:62
[4] foldl_impl(op::Base.BottomRF{typeof(Base.add_sum)}, nt::Int64, itr::String)
@ Base ./reduce.jl:48 [inlined]
[5] mapfoldl_impl(f::typeof(identity), op::typeof(Base.add_sum), nt::Int64, itr::String)
@ Base ./reduce.jl:44 [inlined]
[6] mapfoldl(f::typeof(identity), op::typeof(Base.add_sum), itr::String; init::Int64)
@ Base ./reduce.jl:175 [inlined]
[7] mapreduce(f::typeof(identity), op::typeof(Base.add_sum), itr::String; kw::@Kwargs{init::Int64})
@ Base ./reduce.jl:307 [inlined]
[8] sum(f::typeof(identity), a::String; kw::@Kwargs{init::Int64})
@ Base ./reduce.jl:535 [inlined]
[9] sum(a::String; kw::@Kwargs{init::Int64})
@ Base ./reduce.jl:564 [inlined]
[10] top-level scope
@ REPL[12]:1
|
兼容性
Julia1.10这个宏从Julia1.10开始可用。 |
# *`基地。瓦尔`*-类型
Val(c)
回来吧 瓦尔{c}(),其中不包含运行时数据。 像这样的类型可以用来通过值传递函数之间的信息 c,这必须是一个 轨道,轨道 值或一个 符号. 此构造的目的是能够直接(在编译时)对常量进行调度,而无需在运行时测试常量的值。
*例子*
julia> f(::Val{true}) = "Good"
f (generic function with 1 method)
julia> f(::Val{false}) = "Bad"
f (generic function with 2 methods)
julia> f(Val(true))
"Good"
# *`核心。瓦拉格`*-注册_
Vararg{T,N}
元组类型的最后一个参数 元组可以是特殊值 瓦拉格,表示任意数量的尾随元素。 瓦拉格{T,N} 完全对应于 N 类型的元素 T. 最后 瓦拉格{T} 对应于零个或多个类型的元素 T. 瓦拉格 元组类型用于表示varargs方法接受的参数(请参阅 Varargs函数。)
请参阅 N.婴儿.
*例子*
julia> mytupletype = Tuple{AbstractString, Vararg{Int}}
Tuple{AbstractString, Vararg{Int64}}
julia> isa(("1",), mytupletype)
true
julia> isa(("1",1), mytupletype)
true
julia> isa(("1",1,2), mytupletype)
true
julia> isa(("1",1,2,3.0), mytupletype)
false
# *`基地。有些东西`*-函数
something(x...)
*例子*
julia> something(nothing, 1)
1
julia> something(Some(1), nothing)
1
julia> something(Some(nothing), 2) === nothing
true
julia> something(missing, nothing)
missing
julia> something(nothing, nothing)
ERROR: ArgumentError: No value arguments present
# *`基地。@东西`*-马科罗_
@something(x...)
短路版本的 有些东西.
*例子*
julia> f(x) = (println("f($x)"); nothing);
julia> a = 1;
julia> a = @something a f(2) f(3) error("Unable to find default for `a`")
1
julia> b = nothing;
julia> b = @something b f(2) f(3) error("Unable to find default for `b`")
f(2)
f(3)
ERROR: Unable to find default for `b`
[...]
julia> b = @something b f(2) f(3) Some(nothing)
f(2)
f(3)
julia> b === nothing
true
|
兼容性
Julia1.7这个宏从Julia1.7开始可用。 |
# *`基地。枚举。@枚举`*-马科罗_
@enum EnumName[::BaseType] value1[=x] value2[=y]
创建一个 枚举{BaseType} 带名称的子类型 枚举名 和枚举成员值 价值1 和 价值2 可选的赋值值为 x 和 y,分别。 枚举名 可以像其他类型和枚举成员值一样用作常规值,例如
*例子*
julia> @enum Fruit apple=1 orange=2 kiwi=3
julia> f(x::Fruit) = "I'm a Fruit with value: $(Int(x))"
f (generic function with 1 method)
julia> f(apple)
"I'm a Fruit with value: 1"
julia> Fruit(1)
apple::Fruit = 1
值也可以在一个 開始啦。 块,例如
@enum EnumName begin
value1
value2
end
基本类型,其中默认为 Int32,必须是 整数. 成员值可以在枚举类型和 基本类型. 讀! 和 写 自动执行这些转换。 如果枚举是用非默认值创建的 基本类型, 整数(value1) 将返回整数 价值1 与类型 基本类型.
列出枚举使用的所有实例 实例,例如
julia> instances(Fruit)
(apple, orange, kiwi)
可以从枚举实例构造符号:
julia> Symbol(apple)
:apple
# *`核心。Expr`*-类型
Expr(head::Symbol, args...)
在解析的julia代码(ASTs)中表示复合表达式的类型。 每个表达式由一个 头 符号 识别它是哪种类型的表达式(例如调用,for循环,条件语句等。)和子表达式(例如调用的参数)。 子表达式存储在 向量{Any} 被称为字段 阿格斯.
*例子*
julia> Expr(:call, :+, 1, 2)
:(1 + 2)
julia> dump(:(a ? b : c))
Expr
head: Symbol if
args: Array{Any}((3,))
1: Symbol a
2: Symbol b
3: Symbol c
# *`核心。符号`*-类型
Symbol
在解析的julia代码(Ast)中用于表示标识符的对象类型。 也经常用作名称或标签来识别实体(例如作为字典键)。 符号s可以使用输入 : 报价操作员:
julia> :name
:name
julia> typeof(:name)
Symbol
julia> x = 42
42
朱莉娅>eval(:x)
42
符号s也可以通过调用构造函数从字符串或其他值构造 符号(x。..).
符号s是不可变的,它们的实现对所有对象都重复使用相同的对象 符号s同名。
不像字符串, 符号s是不支持字符迭代的"原子"或"标量"实体。
泛型函数
# *`核心。功能`*-类型
Function
所有函数的抽象类型。
*例子*
julia> isa(+, Function)
true
julia> typeof(sin)
typeof(sin) (singleton type of function sin, subtype of Function)
julia> ans <: Function
true
# *`基地。哈斯米索德`*-函数
hasmethod(f, t::Type{<:Tuple}[, kwnames]; world=get_world_counter()) -> Bool
确定给定的泛型函数是否具有匹配给定的方法 元组 具有世界年龄上限的参数类型由 世界.
如果关键字参数名称的元组 姓名 被提供,这也检查是否的方法 f 匹配 t 具有给定的关键字参数名称。 如果匹配方法接受可变数量的关键字参数,例如 夸格斯。..,任何在 姓名 被认为是有效的。 否则,提供的名称必须是方法关键字参数的子集。
请参阅 适用.
|
兼容性
Julia1.2提供关键字参数名称需要Julia1.2或更高版本。 |
*例子*
julia> hasmethod(length, Tuple{Array})
true
julia> f(; oranges=0) = oranges;
julia> hasmethod(f, Tuple{}, (:oranges,))
true
julia> hasmethod(f, Tuple{}, (:apples, :bananas))
false
julia> g(; xs...) = 4;
julia> hasmethod(g, Tuple{}, (:a, :b, :c, :d)) # g accepts arbitrary kwargs
true
# *`基地。鹿isambiguous`*-函数
Base.isambiguous(m1, m2; ambiguous_bottom=false) -> Bool
确定是否两种方法 m1 和 m2 对于某些呼叫签名可能是模棱两可的。 此测试在相同功能的其他方法的上下文中执行;隔离, m1 和 m2 可能是模棱两可的,但是如果定义了解决模棱两可的第三种方法,则返回 错误. 或者,在隔离 m1 和 m2 可能是有序的,但如果第三种方法不能与它们排序,它们可能会导致歧义。
对于参数类型, 模棱两可的,模棱两可的 关键字参数控制是否 联合{} 算作类型参数的不明确交集—when 真的,它被认为是模棱两可的,当 错误 事实并非如此。
*例子*
julia> foo(x::Complex{<:Integer}) = 1
foo (generic function with 1 method)
julia> foo(x::Complex{<:Rational}) = 2
foo (generic function with 2 methods)
julia>m1,m2=collect(方法(foo));
julia>typeintersect(m1.sig,m2。sig)
元组{typeof(foo), Complex{Union{}}}
朱莉娅>基地。isambiguous(m1,m2,ambiguous_bottom=true)
真的
朱莉娅>基地。isambiguous(m1,m2,ambiguous_bottom=false)
错误
# *`核心。调用`*-函数
invoke(f, argtypes::Type, args...; kwargs...)
invoke(f, argtypes::Method, args...; kwargs...)
invoke(f, argtypes::CodeInstance, args...; kwargs...)
为给定的泛型函数调用方法 f 匹配指定的类型 [医]银型 在指定的参数上 阿格斯 并传递关键字参数 夸格斯. 论点 阿格斯 必须符合指定的类型 [医]银型,即不自动执行转换。 此方法允许调用最具体的匹配方法以外的方法,当显式需要更一般定义的行为时(通常作为相同函数的更具体方法的实现的一部分),这很有用。 但是,因为这意味着运行时必须做更多的工作, 调用 通常也比常规呼叫进行正常调度慢-有时明显如此。
使用时要小心 调用 对于你不写的函数。 什么定义用于给定 [医]银型 是一个实现细节,除非函数显式声明调用与某些 [医]银型 是公共API的一部分。 例如,之间的变化 f1 和 f2 在下面的示例中通常被认为是兼容的,因为该更改由具有正常(非-调用)打电话。 但是,如果您使用,则更改是可见的 调用.
*通过 方法 而不是签名*
该 [医]银型 参数可能是一个 方法,在这种情况下,完全绕过普通方法表查找,直接调用给定方法。 需要此功能并不常见。 特别要注意的是,指定 方法 普通调度(或普通调用)可能完全无法访问,例如,因为它被更具体的方法替换或完全复盖。 如果该方法是普通方法表的一部分,则此调用的行为类似于 调用(f,方法。sig,args。..).
|
兼容性
朱莉娅1.12通过a |
*通过 [医]代码 而不是签名*
该 [医]银型 参数可能是一个 [医]代码,绕过方法查找和特化。 此调用的语义类似于 [医]代码'的 调用 指针。 调用a是错误的 [医]代码 具有与其父级不匹配的参数 方法/方法 或来自一个不包括在 min_世界/最大世界 射程。 调用a是未定义的行为 [医]代码 其行为与其字段中指定的约束不匹配。 对于一些代码实例与 主人!==没什么 (即外部编译器生成的),在通过预编译后调用它们可能是错误的。 这是一个高级接口,用于外部编译器插件。
|
兼容性
朱莉娅1.12通过a |
*例子*
julia> f(x::Real) = x^2;
julia> f(x::Integer) = 1 + invoke(f, Tuple{Real}, x);
julia> f(2)
5
julia> f1(::Integer) = Integer
f1(::Real) = Real;
julia> f2(x::Real) = _f2(x)
_f2(::Integer) = Integer
_f2(_) = Real;
julia> f1(1)
Integer
julia> f2(1)
Integer
julia> invoke(f1, Tuple{Real}, 1)
Real
julia> invoke(f2, Tuple{Real}, 1)
Integer
# *`基地。@调用`*-马科罗_
@invoke f(arg::T, ...; kwargs...)
提供了一个方便的呼叫方式 调用通过扩展 @invoke f(arg1::T1,arg2::T2;kwargs...) 到 调用(f,元组{T1,T2},arg1,arg2;kwargs...). 当参数的类型注释被省略时,它将被替换为 核心。类型;类型 那个论点。 调用一个方法,其中一个参数是无类型的或显式类型为 任何,用注释参数 ::任何.
它还支持以下语法:
* @invoke(x::X)。f 扩展到 调用(getproperty,元组{X,Symbol},x,:f)
* @invoke(x::X)。f=v::V 扩展到 调用(setproperty!,元组{X,Symbol,V},x,:f,v)
* @invoke(xs::Xs)[i::I] 扩展到 调用(getindex,元组{Xs,I},xs,i)
* @invoke(xs::Xs)[i::I]=v::V 扩展到 调用(setindex!,元组{Xs,V,I},xs,v,i)
*例子*
julia> @macroexpand @invoke f(x::T, y)
:(Core.invoke(f, Tuple{T, Core.Typeof(y)}, x, y))
julia> @invoke 420::Integer % Unsigned
0x00000000000001a4
julia> @macroexpand @invoke (x::X).f
:(Core.invoke(Base.getproperty, Tuple{X, Core.Typeof(:f)}, x, :f))
julia> @macroexpand @invoke (x::X).f = v::V
:(Core.invoke(Base.setproperty!, Tuple{X, Core.Typeof(:f), V}, x, :f, v))
julia> @macroexpand @invoke (xs::Xs)[i::I]
:(Core.invoke(Base.getindex, Tuple{Xs, I}, xs, i))
julia> @macroexpand @invoke (xs::Xs)[i::I] = v::V
:(Core.invoke(Base.setindex!, Tuple{Xs, V, I}, xs, v, i))
|
兼容性
Julia1.7此宏需要Julia1.7或更高版本。 |
|
兼容性
Julia1.9此宏从Julia1.9导出。 |
|
兼容性
Julia1.10从Julia1.10开始支持附加语法。 |
# *`基地。invokelatest,invokelatest`*-函数
invokelatest(f, args...; kwargs...)
电话 f(args...;夸格斯。..),但保证了最新的方法 f 将被执行。 这在特殊情况下很有用,例如长时间运行的事件循环或可能调用函数过时版本的回调函数 f. (缺点是 invokelatest,invokelatest 比打电话慢一点 f 直接,并且结果的类型不能由编译器推断。)
|
兼容性
Julia1.9在Julia1.9之前,此函数未导出,并被调用为 |
# *`基地。@invokelatest`*-马科罗_
@invokelatest f(args...; kwargs...)
提供了一个方便的呼叫方式 [医非专利]. @invokelatest f(args。..;夸格斯。..) 将简单地扩展到 基地。invokelatest(f,args...;夸格斯。..).
它还支持以下语法:
* @invokelatest x.f 扩展到 基地。invokelatest(getproperty,x,:f)
* @invokelatest x.f=v 扩展到 基地。invokelatest(setproperty!,x,:f,v)
* @invokelatest xs[i] 扩展到 基地。invokelatest(getindex,xs,i)
* @invokelatest xs[i]=v 扩展到 基地。invokelatest(setindex!,xs,v,i)
|
注意如果 |
|
兼容性
Julia1.7此宏需要Julia1.7或更高版本。 |
|
兼容性
Julia1.9在Julia1.9之前,此宏未导出,并被称为 |
|
兼容性
朱莉娅1.10附加 |
# *`基地。:|>`*-函数
|>(x, f)
应用函数的中缀运算符 f 到论证 x. 这允许 f(g(x)) 要写 x/>g/>f. 当与匿名函数一起使用时,定义周围通常需要括号以获得预期的链。
*例子*
julia> 4 |> inv
0.25
julia> [2, 3, 5] |> sum |> inv
0.1
julia> [0 1; 2 3] .|> (x -> x^2) |> sum
14
# *`基地。:∘`*-函数
f ∘ g
组成函数:即 (f≠g)(args...;夸格斯。..) 手段 f(g(args...;夸格斯。..)). 该 ∘ 符号可以通过键入在Julia REPL(和大多数编辑器,适当配置)中输入 \circ<tab>.
函数组合也以前缀形式工作: ∘(f,g) 是一样的 f>g. 前缀形式支持多个函数的组合: ∘(f,g,h)=f∘g∘h 和飞溅 ∘(fs...) 用于组成可迭代的函数集合。 最后一个论点 ∘ 先执行。
|
兼容性
Julia1.4多功能组合至少需要Julia1.4。 |
|
兼容性
Julia1.5一个函数的组成∘(f)至少需要Julia1.5。 |
|
兼容性
Julia1.7使用关键字参数至少需要Julia1.7。 |
*例子*
julia> map(uppercase∘first, ["apple", "banana", "carrot"])
3-element Vector{Char}:
'A': ASCII/Unicode U+0041 (category Lu: Letter, uppercase)
'B': ASCII/Unicode U+0042 (category Lu: Letter, uppercase)
'C': ASCII/Unicode U+0043 (category Lu: Letter, uppercase)
julia> (==(6)∘length).(["apple", "banana", "carrot"])
3-element BitVector:
0
1
1
julia> fs = [
x -> 2x
x -> x-1
x -> x/2
x -> x+1
];
julia> ∘(fs...)(3)
2.0
# *`基地。复合函数`*-类型
ComposedFunction{Outer,Inner} <: Function
表示两个可调用对象的组成 外::外 和 内::内. 那就是
ComposedFunction(outer, inner)(args...; kw...) === outer(inner(args...; kw...))
构造一个实例的首选方法 复合函数 是使用组合运算符 ∘:
julia> sin ∘ cos === ComposedFunction(sin, cos)
true
julia> typeof(sin∘cos)
ComposedFunction{typeof(sin), typeof(cos)}
组成的部分存储在 复合函数 并且可以如下检索:
julia> composition = sin ∘ cos
sin ∘ cos
julia> composition.outer === sin
true
julia> composition.inner === cos
true
|
兼容性
Julia1.6ComposedFunction至少需要Julia1.6。 在早期版本中 |
请参阅 ∘.
# *`基地。飞溅,飞溅`*-函数
splat(f)
相当于
my_splat(f) = args->f(args...)
即给定一个函数返回一个新函数,该函数接受一个参数并将其拆分到原始函数中。 作为适配器,这对于在需要单个参数的上下文中传递多参数函数非常有用,但将元组作为该单个参数传递。
*例子*
julia> map(splat(+), zip(1:3,4:6))
3-element Vector{Int64}:
5
7
9
julia> my_add = splat(+)
splat(+)
julia> my_add((1,2,3))
6
# *`基地。修复`*-类型
Fix{N}(f, x)
表示函数的部分应用版本的类型 f,与论点 x 固定在位置 N::Int. 换句话说, 修复{3}(f,x) 行为类似于 (y1,y2,y3...;kws...)->f(y1,y2,x,y3。..;kws...).
|
兼容性
Julia1.12这个通用功能至少需要Julia1.12,而 |
|
嵌套多个时的注意事项 |
语法
# *`埃瓦尔`*-函数
eval(expr)
计算包含模块的全局范围中的表达式。 每个 模块 (定义为 裸模,裸模)有一个私有的1参数定义 埃瓦尔,它计算该模块中的表达式,以便在该模块中使用。
# *`基地。评估文件`*-函数
evalfile(path::AbstractString, args::Vector{String}=String[])
使用以下方法将文件加载到匿名模块中 包括,计算所有表达式,并返回最后一个表达式的值。 可选项 阿格斯 参数可用于设置脚本的输入参数(即全局参数) 阿格斯 变量)。 请注意,定义(例如方法,全局变量)在匿名模块中进行评估,并且不会影响当前模块。
*例子*
julia> write("testfile.jl", """
@show ARGS
1 + 1
""");
julia> x = evalfile("testfile.jl", ["ARG1", "ARG2"]);
ARGS = ["ARG1", "ARG2"]
julia> x
2
julia> rm("testfile.jl")
# *`基地。@inbounds`*-马科罗_
@inbounds(blk)
消除表达式内的数组边界检查。
在下面的示例中,引用元素的范围内检查 i 阵列的 A 被跳过以提高性能。
function sum(A::AbstractArray)
r = zero(eltype(A))
for i in eachindex(A)
@inbounds r += A[i]
end
return r
end
|
使用警告 |
# *`基地。@boundscheck`*-马科罗_
@boundscheck(blk)
注释表达式 大厦 作为一个边界检查块,允许它被忽略 @inbounds.
|
注意其中的函数 |
*例子*
julia> @inline function g(A, i)
@boundscheck checkbounds(A, i)
return "accessing ($A)[$i]"
end;
julia> f1() = return g(1:2, -1);
julia> f2() = @inbounds return g(1:2, -1);
julia> f1()
ERROR: BoundsError: attempt to access 2-element UnitRange{Int64} at index [-1]
Stacktrace:
[1] throw_boundserror(::UnitRange{Int64}, ::Tuple{Int64}) at ./abstractarray.jl:455
[2] checkbounds at ./abstractarray.jl:420 [inlined]
[3] g at ./none:2 [inlined]
[4] f1() at ./none:1
[5] top-level scope
julia> f2()
"accessing (1:2)[-1]"
|
警告 |
# *`基地。@内联`*-马科罗_
@inline
给编译器一个提示,这个函数值得内联。
小功能通常不需要 @内联 注释,正如编译器自动执行的那样。 通过使用 @内联 在更大的函数上,可以给编译器一个额外的轻推来内联它。
@内联 可以立即在函数定义之前或在函数体中应用。
# annotate long-form definition
@inline function longdef(x)
...
end
# annotate short-form definition
@inline shortdef(x) = ...
# annotate anonymous function that a `do` block creates
f() do
@inline
...
end
|
兼容性
Julia1.8函数体内的用法至少需要Julia1.8。 |
@inline block
给内部调用的编译器一个提示 座 值得内联。
# The compiler will try to inline `f`
@inline f(...)
# The compiler will try to inline `f`, `g` and `+`
@inline f(...) + g(...)
|
注意callsite注释始终优先于应用于被调用函数定义的注释:
|
|
注意当有嵌套的callsite注释时,最里面的注释具有优先级: |
```朱莉娅
@noinline让a0,b0=。..
a=@inline f(a0)#编译器将尝试内联此调用
b=f(b0)#编译器不会尝试内联此调用
返回a,b
结束
```
|
警告尽管callsite注释将尝试强制内联,而不管成本模型如何,但仍有可能无法成功。 特别是,递归调用不能内联,即使它们被注释为 |
|
兼容性
Julia1.8callsite注解至少需要Julia1.8。 |
# *`基地。@noinline`*-马科罗_
@noinline
给编译器一个提示,它不应该内联函数。
小函数通常会自动内联。 通过使用 @noinline 在小功能上,可以防止自动内联。
@noinline 可以立即在函数定义之前或在函数体中应用。
# annotate long-form definition
@noinline function longdef(x)
...
end
# annotate short-form definition
@noinline shortdef(x) = ...
# annotate anonymous function that a `do` block creates
f() do
@noinline
...
end
|
兼容性
Julia1.8函数体内的用法至少需要Julia1.8。 |
@noinline block
给编译器一个提示,它不应该内联调用 座.
# The compiler will try to not inline `f`
@noinline f(...)
# The compiler will try to not inline `f`, `g` and `+`
@noinline f(...) + g(...)
|
注意callsite注释始终优先于应用于被调用函数定义的注释:
|
|
注意当有嵌套的callsite注释时,最里面的注释具有优先级: |
```朱莉娅
@inline让a0,b0=。..
a=@noinline f(a0)#编译器不会尝试内联此调用
b=f(b0)#编译器将尝试内联此调用
返回a,b
结束
```
|
兼容性
Julia1.8callsite注解至少需要Julia1.8。 |
|
请注意,如果函数是微不足道的(例如返回一个常量),它可能会被内联。 |
# *`基地。@nospecialize`*-马科罗_
@nospecialize
应用于函数参数名称,向编译器提示方法实现不应专门用于该参数的不同类型,而是使用该参数的声明类型。 它可以应用于形式参数列表中的参数,也可以应用于函数体中。 当应用于参数时,宏必须包装整个参数表达式,例如, @nospecialize(x::Real) 或 @nospecialize(i::Integer。..) 而不是只包装参数名称。 在函数体中使用时,宏必须出现在语句位置和任何代码之前。
在没有参数的情况下使用时,它适用于父范围的所有参数。 在局部作用域中,这意味着包含函数的所有参数。 在全局(顶级)范围中,这意味着随后在当前模块中定义的所有方法。
您可以使用以下方法重置回默认值 @专业.
function example_function(@nospecialize x)
...
end
function example_function(x, @nospecialize(y = 1))
...
end
function example_function(x, y, z)
@nospecialize x y
...
end
@nospecialize
f(y) = [x for x in y]
@specialize
|
注 |
*例子*
julia> f(A::AbstractArray) = g(A)
f (generic function with 1 method)
julia> @noinline g(@nospecialize(A::AbstractArray)) = A[1]
g (generic function with 1 method)
julia> @code_typed f([1.0])
CodeInfo(
1 ─ %1 = invoke Main.g(_2::AbstractArray)::Float64
└── return %1
) => Float64
在这里, @nospecialize 注释结果相当于
f(A::AbstractArray) = invoke(g, Tuple{AbstractArray}, A)
确保只生成一个版本的本机代码 g,一个是通用的任何 抽象阵列. 但是,仍然为两者推断特定的返回类型 g 和 f,这仍然用于优化 f 和 g.
# *`基地。@nospecializeinfer`*-马科罗_
Base.@nospecializeinfer function f(args...)
@nospecialize ...
...
end
Base.@nospecializeinfer f(@nospecialize args...) = ...
告诉编译器推断 f 使用已声明的 @nospecialized参数。 这可用于限制推理期间编译器生成的特化的数量。
*例子*
julia> f(A::AbstractArray) = g(A)
f (generic function with 1 method)
julia> @noinline Base.@nospecializeinfer g(@nospecialize(A::AbstractArray)) = A[1]
g (generic function with 1 method)
julia> @code_typed f([1.0])
CodeInfo(
1 ─ %1 = invoke Main.g(_2::AbstractArray)::Any
└── return %1
) => Any
在这个例子中, f 将推断每个特定类型的 A,但是 g 只会用声明的参数类型推断一次 A::抽象阵列,这意味着编译器在无法推断其具体返回类型的情况下不会看到过多的推理时间。 没有 @nospecializeinfer, f([1.0]) 将推断返回类型 g 作为 漂浮64,表明推断为 g(::向量{Float64}) 尽管禁止专门的代码生成。
|
兼容性
Julia1.10使用 |
# *`基地。@constprop`*-马科罗_
Base.@constprop setting [ex]
控制带注释函数的过程间常数传播的模式。
二 设置支持s:
* 基地。@constprop:咄咄逼人[ex]:积极应用恒定传播。 对于返回类型取决于参数值的方法,这可以以额外的编译时间为代价产生改进的推理结果。
* 基地。@constprop:无[ex]:禁用常量传播。 这可以减少Julia认为值得常量传播的函数的编译时间。 常见的情况是功能与 布尔-或 符号-值参数或关键字参数。
基地。@constprop 可以立即在函数定义之前或在函数体中应用。
# annotate long-form definition
Base.@constprop :aggressive function longdef(x)
...
end
# annotate short-form definition
Base.@constprop :aggressive shortdef(x) = ...
# annotate anonymous function that a `do` block creates
f() do
Base.@constprop :aggressive
...
end
|
兼容性
Julia1.10函数体内的用法至少需要Julia1.10。 |
# *`基地。@gensym`*-马科罗_
@gensym
为变量生成gensym符号。 例如, @gensym x y 被转化为 x=gensym("x");y=gensym("y").
# *`var"名称"`*-密码_
var
语法 var"示例" 引用一个名为 符号("例子"),尽管 例子 不是有效的Julia标识符名称。
这对于与具有用于构造有效标识符的不同规则的编程语言的互操作性非常有用。 例如,要参考 R 变量 画画。细分市场,您可以使用 var"画。段" 在你的朱莉娅密码里。
它还用于 展览 julia的源代码已经通过宏卫生或其他包含无法正常解析的变量名。
请注意,此语法需要解析器支持,因此它由解析器直接扩展,而不是作为普通字符串宏实现 @var_str.
|
兼容性
Julia1.3此语法至少需要Julia1.3。 |
# *`基地。辛德鲁普。@simd`*-马科罗_
@simd
注释a 为 循环以允许编译器采取额外的自由以允许循环重新排序
|
警告此功能是实验性的,可能会在未来版本的Julia中更改或消失。 不正确使用 |
对象在一个 @simd for 循环应该是一维范围。 通过使用 @simd,你正在断言循环的几个属性:
*以任意或重叠顺序执行迭代是安全的,并特别考虑减少变量。
*减少变量上的浮点运算可以重新排序或收缩,可能会导致不同于没有的结果 @simd.
在许多情况下,Julia能够自动矢量化内部for循环,而无需使用 @simd. 使用 @simd 给编译器一点额外的余地,使其在更多的情况下成为可能。 在任何一种情况下,您的内部循环都应该具有以下属性以允许矢量化:
*循环必须是最内层的循环
*循环体必须是直线代码。 因此, @inbounds当前所有数组访问都需要。 编译器有时会变短 &&, ||,而 ?: 如果无条件地评估所有操作数是安全的,则表达式转换为直线代码。 考虑使用 ifelse功能而不是 ?: 在循环中,如果这样做是安全的。
*访问必须有一个步幅模式,不能是"聚集"(随机索引读取)或"分散"(随机索引写入)。
*步幅应为单位步幅。
|
注意 |
*不存在循环携带的内存依赖 *没有迭代会等待上一个迭代来向前推进。
# *`基地。@生成`*-马科罗_
@generated f
@生成 用于注释将生成的函数。 在生成的函数的主体中,只能读取类型的参数(而不是值)。 函数返回调用函数时计算的带引号的表达式。 该 @生成 宏不应该用于改变全局范围的函数或依赖于可变元素。
见 元编程了解更多详情。
*例子*
julia> @generated function bar(x)
if x <: Integer
return :(x ^ 2)
else
return :(x)
end
end
bar (generic function with 1 method)
julia> bar(4)
16
julia> bar("baz")
"baz"
# *`基地。@assume_effects`*-马科罗_
Base.@assume_effects setting... [ex]
复盖编译器的效果建模。 此宏可用于多种上下文:
-
紧接在方法定义之前,复盖应用方法的整个效果建模。
-
在没有任何参数的函数体中,复盖封闭方法的整个效果建模。
-
应用于代码块,以复盖所应用的代码块的局部效果建模。
*例子*
julia> Base.@assume_effects :terminates_locally function fact(x)
# usage 1:
# this :terminates_locally allows `fact` to be constant-folded
res = 1
0 ≤ x < 20 || error("bad fact")
while x > 1
res *= x
x -= 1
end
return res
end
fact (generic function with 1 method)
julia> code_typed() do
fact(12)
end |> only
CodeInfo(
1 ─ return 479001600
) => Int64
julia> code_typed() do
map((2,3,4)) do x
# usage 2:
# this :terminates_locally allows this anonymous function to be constant-folded
Base.@assume_effects :terminates_locally
res = 1
0 ≤ x < 20 || error("bad fact")
while x > 1
res *= x
x -= 1
end
return res
end
end |> only
CodeInfo(
1 ─ return (2, 6, 24)
) => Tuple{Int64, Int64, Int64}
julia> code_typed() do
map((2,3,4)) do x
res = 1
0 ≤ x < 20 || error("bad fact")
# usage 3:
# with this :terminates_locally annotation the compiler skips tainting
# `:terminates` effect within this `while` block, allowing the parent
# anonymous function to be constant-folded
Base.@assume_effects :terminates_locally while x > 1
res *= x
x -= 1
end
return res
end
end |> only
CodeInfo(
1 ─ return (2, 6, 24)
) => Tuple{Int64, Int64, Int64}
|
兼容性
朱莉娅1.8使用 |
|
兼容性
Julia1.10函数体内的用法至少需要Julia1.10。 |
|
兼容性
Julia1.11代码块注释至少需要Julia1.11。 |
|
警告不当使用此宏会导致未定义的行为(包括崩溃,不正确的答案或其他难以跟踪的错误)。 使用时要小心,只有在绝对需要的情况下才作为最后的手段. 即使在这种情况下,您也应该采取所有可能的步骤来最小化效果断言的强度(例如,不要使用 |
一般来说,每个 设置 value对函数的行为做出断言,而不要求编译器证明这种行为确实是正确的。 这些断言是为所有世界年龄。 因此,建议限制泛型函数的使用,这些泛型函数稍后可能会被扩展以使假设无效(这将导致未定义的行为)。
以下内容 设置s得到支持。
* :一致
* :effect_free
* :nothrow
* :终止_全球
* :终端_局部
* :notaskstate
* :inconcessiblemonly
* :noub
* :noub_if_noinbounds
* :nortcall
* :可折叠
* :可拆卸
* :总计
*扩展帮助*
*`:一致`*
该 :一致 设置断言,对于egal(===)输入:
*终止的方式(返回值,异常,非终止)将始终相同。 *如果方法返回,结果将始终相等。
|
请注意,这特别意味着该方法不能返回新分配的可变对象。 可变对象的多个分配(即使具有相同的内容)也不是平等的。 |
|
注意 增加我∈R,j∈R,x,y:x≡y→fᵢ(x)≡fⱼ(y) 为 对于普通代码实例, 进一步的含义是 |
|
注意 |
|
注意如果 |
*`:effect_free`*
该 :effect_free 设置断言该方法没有外部语义上可见的副作用。 以下是外部语义上可见的副作用的不完整列表:
*更改全局变量的值。 *改变堆(例如数组或可变值),但下文指出的除外 *更改方法表(例如通过调用eval) *文件/网络/等。 I/O *任务切换
但是,以下内容在语义上是显式不可见的,即使它们可能是可观察的:
*内存分配(可变和不可变) *经过的时间 *垃圾收集 *生命周期不超过方法的对象的堆突变(即在方法中分配并且不转义)。 *返回的值(外部可见,但不是副作用)
这里的经验法则是,外部可见的副作用是任何会影响程序其余部分的执行,如果函数没有执行。
|
注意 |
*`:nothrow`*
该 :nothrow 设置断言此方法不会引发异常(即将始终返回值或从不返回)。
|
请注意,这是允许的 |
|
注意如果方法的执行可能引发 |
*`:终止_全球`*
该 :终止_全球 设置断言此方法最终将终止(正常或异常),即不无限期循环。
|
注意这一点 |
|
请注意,编译器将认为这是一个强烈的指示,该方法将相对_quickly_终止,并且可能(如果其他合法)在编译时调用此方法。 也就是说,在_technically_而不是_practically_终止的方法上注释此设置是一个坏主意。 |
*`:终端_locally`*
该 :终端_locally 设置就像 :终止_全球,不同之处在于它仅适用于语法控制流_within_the annotated方法。 因此,它是一个更弱(因此更安全)的断言,如果方法调用其他一些不终止的方法,则允许非终止的可能性。
|
注 |
*`:notaskstate`*
该 :notaskstate 设置断言该方法不使用或修改本地任务状态(任务本地存储,RNG状态等。),因此可以在没有可观察结果的情况下安全地在任务之间移动。
|
注意异常处理的实现利用了任务对象中存储的状态。 但是,这种状态目前不被认为是在 |
|
注意 |
|
注意对任务状态的访问通常也会导致其他影响的污染,例如 |
*`:inconcessiblemonly`*
该 :inconcessiblemonly 设置断言该方法不访问或修改外部可访问的可变内存。 这意味着该方法可以访问或修改新分配的对象的可变内存,这些对象在从该方法返回之前不能被其他方法或顶级执行访问,但它不能访问或修改其参数指向的任何可变全局状态或可变内存。
|
下面的注释是使此假设无效的示例的不完整列表: |
-全球参考或 `[医]全球球` 访问可变全局变量的调用
-全局分配或 `setglobal!` 调用对非常量全局变量执行赋值 - `塞特菲尔德!` 更改全局可变变量字段的调用
|
注意这一点 |
*`:noub`*
该 :noub 设置断言该方法不会执行任何未定义的行为(对于任何输入)。 请注意,未定义的行为在技术上可能会导致方法违反任何其他效果断言(例如 :一致 或 :effect_free)以及,但我们没有对此进行建模,并且他们假设没有未定义的行为。
*`:nortcall`*
该 :nortcall 设置断言该方法不调用 核心。编译器。返回_类型,并且此方法可能调用的任何其他方法也不调用 核心。编译器。返回_类型.
|
确切地说,这个断言可以在调用 |
*`:可折叠`*
对于编译器需要保证在编译时常量折叠调用的一组效果,此设置是一个方便的快捷方式。 它目前相当于以下内容 设置s:
* :一致
* :effect_free
* :terminates_globally
* :noub
* :nortcall
|
注意此列表特别不包括 |
|
注意一个明确的 |
*`:可拆卸`*
对于编译器需要保证删除其结果在编译时未使用的调用的一组效果,此设置是一个方便的快捷方式。 它目前相当于以下内容 设置s:
* :effect_free
* :nothrow
* :终止_全球
*`:总计`*
这 设置 是最大可能的效果集。 它目前意味着以下其他 设置s:
* :一致
* :effect_free
* :nothrow
* :terminates_globally
* :notaskstate
* :inconcessiblemonly
* :noub
* :nortcall
|
警告 |
*否定效应*
效果名称的前缀可以是 ! 以指示应从较早的元效应中移除该效应。 例如, :总计!:nothrow 表示虽然调用通常是总计的,但它可能会抛出。
管理弃用
# *`基地。@弃用`*-马科罗_
@deprecate old new [export_old=true]
弃用方法 老 并指定替换调用 新的,定义新方法 老 程中具有指定的签名。
为了防止 老 从被导出,设置 出口_old 到 错误.
请参阅 基地。德瓦恩().
|
兼容性
Julia1.5截至Julia1.5,由 |
*例子*
julia> @deprecate old_export(x) new(x)
old_export (generic function with 1 method)
julia> @deprecate old_public(x) new(x) false
old_public (generic function with 1 method)
致电 @弃用 没有显式的类型注释将定义弃用的方法,接受任意数量的类型的位置和关键字参数 任何.
|
兼容性
当Julia1.9没有显式类型注释时,将转发Julia1.9关键字参数。 对于旧版本,您可以通过执行以下操作手动转发位置参数和关键字参数 |
要将弃用限制为特定签名,请注释 老. 例如,
julia> new(x::Int) = x;
julia>new(x::Float64)=2x;
julia>@弃用旧(x::Int)新(x);
朱莉娅>方法(旧)
#1来自Main的泛型函数"old"的方法:
[1]旧(x::Int64)
@弃用。jl:94
将定义和弃用一个方法 旧(x::Int) 那镜子 新(x::Int) 但不会定义或弃用该方法 旧(X::Float64).
# *`基地。德普瓦恩`*-函数
Base.depwarn(msg::String, funcsym::Symbol; force=false)
印刷业 味精 作为弃用警告。 符号 功能,功能 应该是调用函数的名称,用于确保只为每个调用地点第一次打印弃用警告。 套装 力=真 强制警告总是显示出来,即使茱莉亚是从 --depwarn=不 (默认)。
请参阅 @弃用.
*例子*
function deprecated_func()
Base.depwarn("Don't use `deprecated_func()`!", :deprecated_func)
1 + 1
end
缺失值
# *`基地。@coalesce`*-马科罗_
@coalesce(x...)
短路版本的 聚结,聚结.
*例子*
julia> f(x) = (println("f($x)"); missing);
julia> a = 1;
julia> a = @coalesce a f(2) f(3) error("`a` is still missing")
1
julia> b = missing;
julia> b = @coalesce b f(2) f(3) error("`b` is still missing")
f(2)
f(3)
ERROR: `b` is still missing
[...]
|
兼容性
Julia1.7这个宏从Julia1.7开始可用。 |
# *`基地。跳板,跳板`*-函数
skipmissing(itr)
返回一个迭代器,遍历 itr 跳绳 失踪值。 返回的对象可以使用 itr 如果后者是可转位的。 与缺失值对应的索引无效:它们被跳过 钥匙和 每个索引,和一 MissingException异常 试图使用它们时被抛出。
使用方法 收集资料获得一 阵列 包含非-失踪 价值 itr. 请注意,即使 itr 是一个多维数组,结果将始终是一个 向量资料 因为不可能在保留输入尺寸的同时删除缺失。
*例子*
julia> x = skipmissing([1, missing, 2])
skipmissing(Union{Missing, Int64}[1, missing, 2])
朱莉娅>总和(x)
3
朱莉娅>x[1]
1
朱莉娅>x[2]
错误:MissingException:缺少index(2,)处的值
[...]
朱莉娅>argmax(x)
3
朱莉娅>收集(钥匙(x))
2元素向量{Int64}:
1
3
朱莉娅>收集(skipmissing([1,失踪,2]))
2元素向量{Int64}:
1
2
朱莉娅>收集(skipmissing([1失踪;2失踪]))
2元素向量{Int64}:
1
2
# *`基地。nonmissingtype`*-函数
nonmissingtype(T::Type)
如果 T 是包含的类型的联合 失踪,返回一个新的类型与 失踪 移走。
*例子*
julia> nonmissingtype(Union{Int64,Missing})
Int64
julia> nonmissingtype(Any)
Any
|
兼容性
Julia1.3此函数导出为Julia1.3。 |
系统
# *`基地。跑`*-函数
run(command, args...; wait::Bool = true)
运行一个用反引号构造的命令对象(请参阅 运行外部程序部分)。 如果出现任何错误,包括进程以非零状态退出(当 等等! 是真的)。
该 args... 允许您将文件描述符传递给命令,并且像常规unix文件描述符一样排序(例如 stdin,stdout,stderr,FD(3),FD(4)。..).
如果 等等! 为false,则进程异步运行。 您可以稍后等待它并通过调用来检查其退出状态 成功 返回的进程对象上。
何时 等等! 为false,则进程’I/O流被定向到 德夫努尔. 何时 等等! 是真的,I/O流与父进程共享。 使用方法 管道来控制I/O重定向。
# *`基地。德夫努尔`*-注册_
devnull
在流重定向中使用,以丢弃写入其中的所有数据。 基本上等同于 /开发/空 在Unix或 NUL 在Windows上。 使用方法:
run(pipeline(`cat test.txt`, devnull))
# *`基地。杀`*-Method
kill(p::Process, signum=Base.SIGTERM)
向进程发送信号。 默认是终止进程。 如果进程已经退出,则成功返回,但如果由于其他原因(例如权限不足)杀死进程失败,则会引发错误。
# *`基地。系统。set_process_title`*-函数
Sys.set_process_title(title::AbstractString)
设置进程标题。 在某些操作系统上没有操作。
# *`基地。Cmd公司`*-类型
Cmd(cmd::Cmd; ignorestatus, detach, windows_verbatim, windows_hide, env, dir)
Cmd(exec::Vector{String})
构建一个新的 Cmd公司 对象,表示外部程序和参数,从 cmd公司,同时更改可选关键字参数的设置:
* ignorestatus::Bool:如果 真的 (默认为 错误),则该 Cmd公司 如果返回代码非零,则不会抛出错误。
* 分离::布尔:如果 真的 (默认为 错误),则该 Cmd公司 将在一个新的进程组中运行,使其比 朱莉娅 进程,而不是有Ctrl-C传递给它。
* windows_verbatim::Bool:如果 真的 (默认为 错误),然后在Windows上 Cmd公司 将向进程发送一个命令行字符串,没有引用或转义参数,甚至包含空格的参数。 (在Windows上,参数作为单个"命令行"字符串发送到程序,程序负责将其解析为参数。 默认情况下,空参数和带空格或制表符的参数用双引号引起来 " 在命令行中,以及 \ 或 " 前面有反斜杠。 windows_verbatim=true 对于启动以非标准方式解析其命令行的程序非常有用。)对非Windows系统没有影响。
* windows_hide::Bool:如果 真的 (默认为 错误),然后在Windows上,当 Cmd公司 被执行。 如果控制台已打开或在非Windows系统上,则此操作无效。
* env:设置运行环境变量时使用 Cmd公司. env 是一个将字符串映射到字符串的字典,一个形式的字符串数组 "var=val",数组或元组 "var"=>val 对。 为了修改(而不是替换)现有环境,初始化 env 与 副本(ENV) 然后设置 env["var"]=val 如所希望的。 要添加到一个环境块内 Cmd公司 对象而不替换所有元素,使用 addenv()这将返回一个 .adoc[] 对象与更新的环境。
* dir::抽象字符串:指定命令的工作目录(而不是当前目录)。
对于未指定的任何关键字,当前设置从 cmd公司 被使用。
请注意, Cmd(执行) 构造函数不创建 执行董事. 任何后续更改 执行董事 将反映在 Cmd公司 对象。
最常见的构造方法 Cmd公司 对象带有命令文本(反引号),例如
`ls -l`
然后可以将其传递给 Cmd公司 修改其设置的构造函数,例如
Cmd(`echo "Hello world"`, ignorestatus=true, detach=false)
# *`基地。贝壳形,贝壳形`*-函数
shell_escape(args::Union{Cmd,AbstractString...}; special::AbstractString="")
未报告的 贝壳形,贝壳形 函数是未报告的倒数 基地。shell_split()函数:它接受一个字符串或命令对象,并以这样一种方式转义任何特殊字符,即调用 基地。shell_split()上面会给出原始命令中的单词数组。 该 特别 关键字参数控制除了空格、反斜杠、引号和美元符号之外的哪些字符被认为是特殊的(默认:无)。
*例子*
julia> Base.shell_escape("cat", "/foo/bar baz", "&&", "echo", "done")
"cat '/foo/bar baz' && echo done"
julia> Base.shell_escape("echo", "this", "&&", "that")
"echo this && that"
# *`基地。外壳/外壳`*-函数
shell_split(command::AbstractString)
将shell命令字符串拆分为其各个组件。
*例子*
julia> Base.shell_split("git commit -m 'Initial commit'")
4-element Vector{String}:
"git"
"commit"
"-m"
"Initial commit"
# *`基地。贝壳_escape_posixly`*-函数
shell_escape_posixly(args::Union{Cmd,AbstractString...})
未报告的 贝壳_escape_posixly 函数接受字符串或命令对象并转义任何特殊字符,以便将其作为参数传递给posix shell是安全的。
请参阅: 基地。shell_escape()
*例子*
julia> Base.shell_escape_posixly("cat", "/foo/bar baz", "&&", "echo", "done")
"cat '/foo/bar baz' '&&' echo done"
julia> Base.shell_escape_posixly("echo", "this", "&&", "that")
"echo this '&&' that"
# *`基地。shell_escape_csh`*-函数
shell_escape_csh(args::Union{Cmd,AbstractString...})
shell_escape_csh(io::IO, args::Union{Cmd,AbstractString...})
此函数在字符串参数中引用任何元字符,以便返回的字符串可以插入到命令行中,以便由Unix c shell(csh,tcsh)进行解释,其中每个字符串参数将形成一个单词。
与POSIX shell相反,csh不支持在双引号字符串中使用反斜杠作为一般转义字符。 因此,此函数将可能包含元字符的字符串包装在单引号中,但包含单引号的部分除外,而是将单引号包装在双引号中。 它根据需要在这些类型的引号之间切换。 换行符用反斜杠转义。
此函数也应该适用于POSIX shell,除非输入字符串包含换行符("\n")性格。
# *`基地。shell_escape_wincmd`*-函数
shell_escape_wincmd(s::AbstractString)
shell_escape_wincmd(io::IO, s::AbstractString)
未报告的 shell_escape_wincmd 函数转义窗口 cmd。exe文件 shell元字符。 它逃脱了 ()!^<>&| 通过放置一个 ^ 在前面。 一个 @ 仅在字符串开头转义。 对的 " 字符和它们所包含的字符串是通过非转义传递的. 任何剩余 " 被逃脱了 ^ 确保未转义的数目 " 结果中的字符保持均匀。
自 cmd。exe文件 替代变量引用(如 %用户%)_before_处理转义字符 ^ 和 ",此函数不尝试转义百分号(%),存在 % 在输入可能会导致严重的破损,这取决于在哪里使用的结果。
输入字符串与ASCII控制字符不能转义(NUL,CR,LF)将导致一个 [医]争论者 例外。
结果可以安全地作为参数传递给正在处理的命令调用 CMD。exe/S/C"。.. " (与周围的双引号对),并将由目标应用程序逐字接收,如果输入不包含 % (否则此功能将失败与ArgumentError)。 的存在 % 在输入字符串中可能会导致命令注入漏洞,并可能使此函数输出作为cmd参数的适用性的任何声明无效(由于上面描述的顺序),因此在从各种来源组装字符串时要小心。
此功能可能与 窗口_verbatim 旗帜至 Cmd公司构建过程管道时。
wincmd(c::String) =
run(Cmd(Cmd(["cmd.exe", "/s /c \" $c \""]);
windows_verbatim=true))
wincmd_echo(s::String) =
wincmd("echo " * Base.shell_escape_wincmd(s))
wincmd_echo("hello $(ENV["USERNAME"]) & the \"whole\" world! (=^I^=)")
但请注意,如果输入字符串 s 包含一个 %,参数列表和echo’ed文本可能会损坏,导致任意命令执行。 该参数也可以作为环境变量传递,这避免了 % 以及对 窗口_verbatim 国旗:
cmdargs = Base.shell_escape_wincmd("Passing args with %cmdargs% works 100%!")
run(setenv(`cmd /C echo %cmdargs%`, "cmdargs" => cmdargs))
|
警告CMD在调用批处理文件时所做的参数解析(无论是在 |
!!! 由于CMD解析器/解释器的特殊行为,每个命令后面都有文字 | 符(表示命令管道)必须具有 shell_escape_wincmd 应用两次,因为它将被CMD解析两次。 这意味着ENV变量也会被扩展两次! 例如:
```朱莉娅 to_print="All for1&1for all!" to_print_esc=Base。shell_escape_wincmd(Base.shell_escape_wincmd(to_print)) 运行(Cmd(Cmd(["cmd","/S/C\"break|echo$(to_print_esc)\""]),windows_verbatim=true)) ```
带有I/O流参数 伊俄,结果将写在那里,而不是作为字符串返回。
*例子*
julia> Base.shell_escape_wincmd("a^\"^o\"^u\"")
"a^^\"^o\"^^u^\""
# *`基地。脱脩脟茅脕麓陆脱拢潞卤漏路莽脡脤鲁脟/卤漏路莽录脱脱脥脮戮`*-函数
escape_microsoft_c_args(args::Union{Cmd,AbstractString...})
escape_microsoft_c_args(io::IO, args::Union{Cmd,AbstractString...})
将字符串参数集合转换为可传递给许多Windows命令行应用程序的字符串。
Microsoft Windows将整个命令行作为单个字符串传递给应用程序(与POSIX系统不同,其中shell将命令行拆分为参数列表)。 许多Windows API应用程序(包括julia。exe),使用https://docs.microsoft.com/en-us/cpp/c-language/parsing-c-command-line-arguments[微软C/C++ 运行时]将该命令行拆分为字符串列表。
此函数为与这些规则兼容的解析器实现逆。 它连接要传递给Windows C/C的命令行参数++/Julia应用到命令行中,在需要的地方转义或引用元字符空格、制表符、双引号和反斜杠。
# *`基地。[医]血性`*-函数
setcpuaffinity(original_command::Cmd, cpus) -> command::Cmd
设置cpu亲和性的 命令 通过CPU Id列表(基于1) 中央处理器. 传球 cpu=无 表示如果 原创性_command 有没有。
此功能仅在Linux和Windows中受支持。 MacOS中不支持它,因为libuv不支持关联设置。
|
兼容性
Julia1.8此功能至少需要Julia1.8。 |
*例子*
在Linux中, 任务集 命令行程序可以用来查看如何 [医]血性 有效。
julia> run(setcpuaffinity(`sh -c 'taskset -p $$'`, [1, 2, 5]));
pid 2273's current affinity mask: 13
注意掩码值 13 反映第一,第二和第五位(从最低有效位置计数)导通:
julia> 0b010011
0x13
# *`基地。管道`*-Method
pipeline(from, to, ...)
创建从数据源到目标的管道。 源和目标可以是命令、I/O流、字符串或其他的结果 管道 电话。 至少有一个参数必须是命令。 字符串是指文件名。 当使用两个以上的参数调用时,它们从左到右链接在一起。 例如, 管道(a,b,c) 相当于 管道(管道(a,b),c). 这提供了一种更简洁的方式来指定多级管道。
*例子*:
run(pipeline(`ls`, `grep xyz`))
run(pipeline(`ls`, "out.txt"))
run(pipeline("out.txt", `grep xyz`))
# *`基地。管道`*-Method
pipeline(command; stdin, stdout, stderr, append=false)
将I/O重定向到或从给定的 命令. 关键字参数指定应该重定向哪个命令的流。 追加 控制文件输出是否追加到文件。 这是2参数的更一般版本 管道 函数。 管道(从,到) 相当于 流水线(from,stdout=to) 何时 从 是一个命令,并 管道(to,stdin=from) 何时 从 是另一种数据源。
*例子*:
run(pipeline(`dothings`, stdout="out.txt", stderr="errs.txt"))
run(pipeline(`update`, stdout="log.txt", append=true))
# *`基地。Libc。getpid,getpid`*-函数
getpid() -> Int32
获取Julia的进程ID。
getpid(process) -> Int32
获取子进程ID,如果它仍然存在。
|
兼容性
Julia1.1此功能至少需要Julia1.1。 |
# *`基地。时间_ns`*-函数
time_ns() -> UInt64
获取相对于过去某些机器特定的任意时间的纳秒时间。 主要用途是测量程序执行期间的运行时间。 在系统运行时,返回值保证是单调的(mod2⁶⁴),并且不受时钟漂移或本地日历时间更改的影响,但它可能会在系统重新启动或暂停期间任意更改。
(虽然返回的时间总是以纳秒为单位,但定时分辨率取决于平台。)
# *`基地。@时间`*-马科罗_
@time expr
@time "description" expr
一个执行表达式的宏,在返回表达式的值之前,打印执行所用的时间、分配数以及执行导致分配的总字节数。 垃圾收集(gc)、编译新代码或重新编译无效代码所花费的任何时间都以百分比显示。 任何锁冲突的地方 重入锁,重入锁不得不等待显示为计数。
可选地提供要在时间报告之前打印的描述字符串。
在某些情况下,系统将查看 @时间 表达式并在顶级表达式开始执行之前编译一些被调用的代码。 当这种情况发生时,一些编译时间将不计算在内。 要包括这段时间,您可以运行 @时间@eval。...
|
注意对于更严重的基准测试,请考虑 |
|
兼容性
Julia1.8在Julia1.8中引入了添加描述的选项。 |
在Julia1.8中引入了与编译时间分开显示的重新编译时间
|
兼容性
Julia1.11在Julia1.11中添加了任何锁冲突的报告。 |
julia> x = rand(10,10);
julia> @time x * x;
0.606588 seconds (2.19 M allocations: 116.555 MiB, 3.75% gc time, 99.94% compilation time)
julia> @time x * x;
0.000009 seconds (1 allocation: 896 bytes)
julia> @time begin
sleep(0.3)
1+1
end
0.301395 seconds (8 allocations: 336 bytes)
2
julia> @time "A one second sleep" sleep(1)
A one second sleep: 1.005750 seconds (5 allocations: 144 bytes)
julia> for loop in 1:3
@time loop sleep(1)
end
1: 1.006760 seconds (5 allocations: 144 bytes)
2: 1.001263 seconds (5 allocations: 144 bytes)
3: 1.003676 seconds (5 allocations: 144 bytes)
# *`基地。@timev`*-马科罗_
@timev expr
@timev "description" expr
这是一个详细的版本 @时间 宏。 它首先打印与 @时间,然后任何非零内存分配计数器,然后返回表达式的值。
可选地提供要在时间报告之前打印的描述字符串。
|
兼容性
Julia1.8在Julia1.8中引入了添加描述的选项。 |
julia> x = rand(10,10);
julia> @timev x * x;
0.546770 seconds (2.20 M allocations: 116.632 MiB, 4.23% gc time, 99.94% compilation time)
elapsed time (ns): 546769547
gc time (ns): 23115606
bytes allocated: 122297811
pool allocs: 2197930
non-pool GC allocs:1327
malloc() calls: 36
realloc() calls: 5
GC pauses: 3
julia> @timev x * x;
0.000010 seconds (1 allocation: 896 bytes)
elapsed time (ns): 9848
bytes allocated: 896
pool allocs: 1
# *`基地。@定时`*-马科罗_
@timed
一个执行表达式的宏,并返回表达式的值,以秒为单位的经过时间,分配的总字节,垃圾回收时间,具有各种内存分配计数器的对象,以秒为单位的编译时间, 任何锁冲突的地方 重入锁,重入锁不得不等待显示为计数。
在某些情况下,系统将查看 @定时 表达式并在顶级表达式开始执行之前编译一些被调用的代码。 当这种情况发生时,一些编译时间将不计算在内。 要包括这段时间,您可以运行 @定时@eval。...
julia> stats = @timed rand(10^6);
julia> stats.time
0.006634834
julia> stats.bytes
8000256
julia> stats.gctime
0.0055765
julia> propertynames(stats.gcstats)
(:allocd, :malloc, :realloc, :poolalloc, :bigalloc, :freecall, :total_time, :pause, :full_sweep)
julia> stats.gcstats.total_time
5576500
julia> stats.compile_time
0.0
julia> stats.recompile_time
0.0
|
兼容性
Julia1.5这个宏的返回类型从 |
|
兼容性
朱莉娅1.11 |
# *`基地。@分配`*-马科罗_
@allocated
计算表达式的宏,丢弃结果值,而返回在计算表达式期间分配的总字节数。
如果表达式是函数调用,则会努力仅测量参数表达式和函数期间的分配,排除调用它的任何开销,并且不使用提供的参数值执行常量传播。 如果要包含这些效果,即测量呼叫站点,请使用以下语法 @分配(()->f(1))().
建议只用简单的参数表达式来测量函数调用,例如 x=[];@分配f(x) 而不是 @分配f([]) 为了澄清这一点 f 正在测量。
对于更复杂的表达式,代码只是在适当的位置运行,因此可能会看到由于周围上下文而产生的分配。 例如,这是可能的 @分配f(1) 和 @分配x=f(1) 以给出不同的结果。
julia> @allocated rand(10^6)
8000080
# *`基地。ENV`*-注册_
ENV
对单例的引用 环境,环境,为系统环境变量提供字典接口。
(在Windows上,系统环境变量不区分大小写,并且 ENV 相应地将所有键转换为大写,以便显示,迭代和复制。 可移植代码不应该依赖于按大小写区分变量的能力,并且应该注意设置表面上小写的变量可能会导致大写 ENV 钥匙。)
|
警告改变环境不是线程安全的。 |
*例子*
julia> ENV
Base.EnvDict with "50" entries:
"SECURITYSESSIONID" => "123"
"USER" => "username"
"MallocNanoZone" => "0"
⋮ => ⋮
julia> ENV["JULIA_EDITOR"] = "vim"
"vim"
julia> ENV["JULIA_EDITOR"]
"vim"
# *`基地。系统。windows_version`*-函数
Sys.windows_version()
返回Windows NT内核的版本号作为 版本号,即 v"少校。未成年人。建造",或 v"0.0.0" 如果这不是在Windows上运行。
# *`基地。系统。总计-记忆`*-函数
Sys.total_memory()
以字节为单位获取RAM中的总内存(包括当前使用的内存)。 这个数量可能会受到限制,例如Linux控制组。 有关无约束量,请参阅 系统。total_physical_memory().
# *`基地。系统。免费的,免费的`*-函数
Sys.free_physical_memory()
以字节为单位获取系统的可用内存。 整个金额可能无法用于当前流程;使用 系统。自由记忆() 为实际可用的量。
# *`基地。系统。总计_物理_记忆`*-函数
Sys.total_physical_memory()
以字节为单位获取RAM中的总内存(包括当前使用的内存)。 整个金额可能无法用于当前流程;请参阅 系统。total_memory().
# *`基地。系统。isjsvm`*-函数
Sys.isjsvm([os])
用于测试Julia是否在JavaScript VM(JSVM)中运行的谓词,包括例如在web浏览器中嵌入WebAssembly JavaScript。
|
兼容性
Julia1.2此功能至少需要Julia1.2。 |
# *`基地。系统。isexecutable的`*-函数
isexecutable(path::String)
回来吧 真的 如果给定 路径 具有可执行权限。
|
注意此权限可能会在用户执行之前更改 |
|
请注意,在Julia1.6之前,它没有正确地询问Windows上的文件系统Acl,因此它将返回 |
请参阅 ispath, 可读性, iswritable缧.
# *`基地。系统。可读性`*-函数
isreadable(path::String)
回来吧 真的 如果给定的访问权限 路径 允许当前用户阅读。
|
注意此权限可能会在用户调用之前更改 |
|
注意目前此函数不能正确查询Windows上的文件系统Acl,因此它可能返回错误的结果。 |
|
兼容性
Julia1.11此功能至少需要Julia1.11。 |
请参阅 ispath, isexecutable的, iswritable缧.
isreadable(io) -> Bool
回来吧 错误 如果指定的IO对象不可读。
*例子*
julia> open("myfile.txt", "w") do io
print(io, "Hello world!");
isreadable(io)
end
false
julia> open("myfile.txt", "r") do io
isreadable(io)
end
true
julia> rm("myfile.txt")
# *`基地。系统。iswritable缧`*-函数
iswritable(path::String)
回来吧 真的 如果给定的访问权限 路径 当前用户允许写入。
|
注意此权限可能会在用户调用之前更改 |
|
注意目前此函数不能正确查询Windows上的文件系统Acl,因此它可能返回错误的结果。 |
|
兼容性
Julia1.11此功能至少需要Julia1.11。 |
请参阅 ispath, isexecutable的, 可读性.
iswritable(io) -> Bool
回来吧 错误 如果指定的IO对象不可写。
*例子*
julia> open("myfile.txt", "w") do io
print(io, "Hello world!");
iswritable(io)
end
true
julia> open("myfile.txt", "r") do io
iswritable(io)
end
false
julia> rm("myfile.txt")
# *`基地。@静态`*-马科罗_
@static
在宏扩展时部分评估表达式。
这在构造在某些情况下无效的情况下很有用,例如 ccall 到依赖于操作系统的函数,或在未导入的包中定义的宏。
@静态 需要一个条件。 条件可以在 如果 语句,三元运算符,或 &&`||`. 条件是通过递归扩展宏、降低和执行结果表达式来计算的。 然后,返回匹配的分支(如果有的话)。 条件的所有其他分支在宏展开(并降低或执行)之前被删除。
*例子*
假设我们要解析一个表达式 expr 这仅在macOS上有效。 我们可以用 @静态 与 @static if Sys。isapple()expr结束. 万一我们有 expr_苹果 适用于macOS和 其他人 对于其他操作系统,解决方案与 @静态 会是 @静态Sys。isapple()? expr_apple:expr_others.
版本控制
# *`基地。版本号`*-类型
VersionNumber
遵循以下规范的版本号类型https://semver.org/spec/v2.0.0-rc.2.html[语义版本控制(semver)],由主要,次要和补丁数字值组成,然后是预发布和构建字母数字注释。
版本号 对象可以与所有标准比较运算符(==, <, <= 等。),结果如下semver v2.0.0-rc。2规则。
版本号 具有以下公共字段:
* v.主要::整数
* v.minor::整数
* v.补丁::整数
* v.预发行::元组{Vararg{Union{Integer, AbstractString}}}
* 五、build::元组{Vararg{Union{Integer, AbstractString}}}
*例子*
julia> a = VersionNumber(1, 2, 3)
v"1.2.3"
julia> a >= v"1.2"
true
julia> b = VersionNumber("2.0.1-rc1")
v"2.0.1-rc1"
julia> b >= v"2.0.1"
false
错误
# *`基地。错误`*-函数
error(msg...)
提出一个 ErrorException异常 用一个由 字符串(味精。..).
error(message::AbstractString)
提出一个 ErrorException异常 与给定的消息。
# *`基地。当前概念`*-函数
current_exceptions(task::Task=current_task(); [backtrace::Bool=true])
获取当前正在处理的异常堆栈。 对于嵌套的catch块,可能存在多个当前异常,在这种情况下,最近抛出的异常是堆栈中的最后一个。 堆栈返回为 [医]常规草堆 它是命名元组的AbstractVector (例外,回溯). 如果 后退,后退 为false,则每对中的backtrace将设置为 什么都没有.
显式传递 任务 将返回任意任务上的当前异常堆栈。 这对于检查由于未捕获异常而失败的任务非常有用。
|
兼容性
Julia1.7这个函数按实验名称去了 |
# *`基地。@断言`*-马科罗_
@assert cond [text]
扔一个 断言错误如果 康德 是 错误. 这是编写断言的首选语法,断言是假定为true的条件,但用户可能会决定检查,以便在失败时进行调试。 可选消息 文本 在断言失败时显示。
|
警告在某些优化级别可能会禁用assert。 因此,Assert应仅用作调试工具,而不用于身份验证验证(例如,验证密码或检查数组边界)。 代码不能依赖于运行的副作用 |
*例子*
julia> @assert iseven(3) "3 is an odd number!"
ERROR: AssertionError: 3 is an odd number!
julia> @assert isodd(3) "What even are numbers?"
# *`基地。实验性的。register_error_hint`*-函数
Experimental.register_error_hint(handler, exceptiontype)
注册"提示"功能 处理程序(io,异常) 这可以为用户提供规避错误的潜在方法。 处理程序 应检查 例外情况 查看是否满足适合提示的条件,如果满足,则生成输出到 伊俄. 包裹应该打电话 register_error_hint 从他们的内部 __init__ 函数。
对于特定的异常类型, 处理程序 需要接受额外的参数:
* 方法;方法:提供 处理程序(io,exc::MethodError,argtypes,kwargs),它将组合参数拆分为位置参数和关键字参数。
发出提示时,输出通常应以 \n.
如果您定义自定义异常类型,您的 n.淋浴器 方法可以通过调用支持提示 实验性的。show_error_hints.
*例子*
julia> module Hinter
only_int(x::Int) = 1
any_number(x::Number) = 2
function __init__()
Base.Experimental.register_error_hint(MethodError) do io, exc, argtypes, kwargs
if exc.f == only_int
# Color is not necessary, this is just to show it's possible.
print(io, "\nDid you mean to call ")
printstyled(io, "`any_number`?", color=:cyan)
end
end
end
end
如果你打电话 欣特只有_int 在一个不是 Int型 (从而触发一个 方法;方法),它发出提示:
julia> Hinter.only_int(1.0)
ERROR: MethodError: no method matching only_int(::Float64)
The function `only_int` exists, but no method is defined for this combination of argument types.
Did you mean to call `any_number`?
Closest candidates are:
...
|
兼容性
Julia1.5自定义错误提示自Julia1.5起可用。 |
|
警告此接口是实验性的,如有更改或删除,恕不另行通知. 要使自己免受更改的影响,请考虑将任何注册放在 |
# *`基地。实验性的。show_error_hints`*-函数
Experimental.show_error_hints(io, ex, args...)
从 实验性的。register_error_hint对于特定的异常类型 类型(ex). 阿格斯 必须包含该类型的处理程序期望的任何其他参数。
|
兼容性
Julia1.5自定义错误提示自Julia1.5起可用。 |
|
警告此接口是实验性的,如有更改或删除,恕不另行通知. |
# *`核心。BoundsError`*-类型
BoundsError([a],[i])
数组的索引操作, a,试图访问索引处的越界元素 i.
*例子*
julia> A = fill(1.0, 7);
julia> A[8]
ERROR: BoundsError: attempt to access 7-element Vector{Float64} at index [8]
julia> B = fill(1.0, (2,3));
julia> B[2, 4]
ERROR: BoundsError: attempt to access 2×3 Matrix{Float64} at index [2, 4]
julia> B[9]
ERROR: BoundsError: attempt to access 2×3 Matrix{Float64} at index [9]
# *`核心。脱脩脟茅脕麓陆脱`*-类型
DivideError()
整数除法尝试分母值为0。
*例子*
julia> 2/0
Inf
julia> div(2, 0)
ERROR: DivideError: integer division error
Stacktrace:
[...]
# *`核心。N.域名,域名`*-类型
DomainError(val)
DomainError(val, msg)
论点 瓦尔 函数或构造函数在有效域之外.
*例子*
julia> sqrt(-1)
ERROR: DomainError with -1.0:
sqrt was called with a negative real argument but will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).
Stacktrace:
[...]
# *`核心。ErrorException异常`*-类型
ErrorException(msg)
泛型错误类型。 错误消息,在 .味精 字段,可以提供更具体的细节。
*例子*
julia> ex = ErrorException("I've done a bad thing");
julia> ex.msg
"I've done a bad thing"
# *`核心。N.恐怖,恐怖`*-类型
FieldError(type::DataType, field::Symbol)
试图访问无效的操作 领域 在一个对象 类型.
|
兼容性
Julia1.12在Julia1.12之前,无效的字段访问抛出了一个 |
见 盖菲尔德
*例子*
julia> struct AB
a::Float32
b::Float64
end
julia> ab = AB(1, 3)
AB(1.0f0, 3.0)
朱莉娅>ab。c#字段 `c` 不存在
错误:FieldError:AB型没有字段 `c`,可用字段: `a`, `b`
[医]堆垛机:
[...]
# *`核心。N.恐怖,恐怖`*-类型
InexactError(name::Symbol, T, val)
不能完全转换 瓦尔 要键入 T 函数的方法中 姓名.
*例子*
julia> convert(Float64, 1+2im)
ERROR: InexactError: Float64(1 + 2im)
Stacktrace:
[...]
# *`核心。InterruptException异常`*-类型
InterruptException()
该过程被终端中断(CTRL+C)停止。
请注意,在Julia脚本中没有 -我 (互动)选项, InterruptException异常 默认情况下不抛出。 打电话来 基地。exit_on_sigint(false)在脚本中可以恢复REPL的行为。 或者,可以从Julia脚本开始
julia -e "include(popfirst!(ARGS))" script.jl
让 InterruptException异常 在执行过程中由CTRL+c抛出。
# *`基地。ProcessFailedException异常`*-类型
ProcessFailedException
指示进程有问题的退出状态。 当运行命令或管道时,这被抛出以指示返回非零退出代码(即调用的进程失败)。
# *`基地。系统错误`*-类型
SystemError(prefix::AbstractString, [errno::Int32])
系统调用失败,并带有错误代码(在 厄尔诺 全局变量)。
# *`核心。打字错误`*-类型
TypeError(func::Symbol, context::AbstractString, expected::Type, got)
类型断言失败,或使用不正确的参数类型调用内部函数。
# *`核心。[医]无犯罪者`*-类型
UndefKeywordError(var::Symbol)
所需的关键字参数 瓦尔 未在函数调用中分配。
*例子*
julia> function my_func(;my_arg)
return my_arg + 1
end
my_func (generic function with 1 method)
julia> my_func()
ERROR: UndefKeywordError: keyword argument `my_arg` not assigned
Stacktrace:
[1] my_func() at ./REPL[1]:2
[2] top-level scope at REPL[2]:1
# *`核心。UndefRefError碌录潞陆`*-类型
UndefRefError()
没有为给定对象定义项或字段。
*例子*
julia> struct MyType
a::Vector{Int}
MyType() = new()
end
julia> A = MyType()
MyType(#undef)
julia> A.a
ERROR: UndefRefError: access to undefined reference
Stacktrace:
[...]
# *`核心。不败者`*-类型
UndefVarError(var::Symbol, [scope])
未定义当前范围中的符号。
*例子*
julia> a
ERROR: UndefVarError: `a` not defined in `Main`
julia> a = 1;
julia> a
1
# *`基地。重试`*-函数
retry(f; delays=ExponentialBackOff(), check=nothing) -> Function
返回一个调用函数的匿名函数 f. 如果出现例外情况, f 被重复地再次调用,每次 支票 申报表 真的,在等待指定的秒数后 延误. 支票 应输入 延误目前的状态和 例外情况.
|
兼容性
Julia1.2在Julia1.2之前此签名仅限于 |
*例子*
retry(f, delays=fill(5.0, 3))
retry(f, delays=rand(5:10, 2))
retry(f, delays=Base.ExponentialBackOff(n=3, first_delay=5, max_delay=1000))
retry(http_get, check=(s,e)->e.status == "503")(url)
retry(read, check=(s,e)->isa(e, IOError))(io, 128; all=false)
活动
# *`基地。定时器`*-Method
Timer(callback::Function, delay; interval = 0, spawn::Union{Nothing,Bool}=nothing)
创建一个运行函数的计时器 回调;回调 在每个定时器到期。
等待任务被唤醒和功能 回调;回调 在初始延迟后调用 延迟 秒,然后用给定的重复 间隔时间 几秒钟内。 如果 间隔时间 等于 0,回调只运行一次。 的功能 回调;回调 用一个参数调用,即计时器本身。 通过调用停止计时器 接近/接近. 该 回调;回调 如果计时器已经过期,仍然可以运行最后一次。
如果 产卵,产卵 是 真的,创建的任务将被产生,这意味着它将被允许移动线程,这避免了强制父任务卡在它所在的线程上的副作用。 如果 产卵,产卵 是 什么都没有 (默认),如果父任务不粘,则会生成该任务。
|
兼容性
朱莉娅1.12 |
*例子*
这里第一个数字在延迟两秒后打印,然后快速打印下面的数字。
julia> begin
i = 0
cb(timer) = (global i += 1; println(i))
t = Timer(cb, 2, interval=0.2)
wait(t)
sleep(0.5)
close(t)
end
1
2
3
# *`基地。定时器`*-类型
Timer(delay; interval = 0)
创建一个定时器,唤醒等待它的任务(通过调用 等等!在定时器对象上)。
等待任务至少在初始延迟后被唤醒 延迟 秒,然后在至少之后重复 间隔时间 秒又过去了。 如果 间隔时间 等于 0,定时器只触发一次。 当计时器关闭时(由 接近/接近)等待的任务会被错误唤醒。 使用方法 isopen的检查计时器是否仍处于活动状态。 使用方法 t.超时 和 t.间隔 要读取a的设置条件 定时器 t.
julia> t = Timer(1.0; interval=0.5)
Timer (open, timeout: 1.0 s, interval: 0.5 s) @0x000000010f4e6e90
julia> isopen(t)
true
julia> t.timeout
1.0
julia> close(t)
julia> isopen(t)
false
|
注 |
|
注A |
# *`基地。异步控制`*-Method
AsyncCondition(callback::Function)
创建调用给定的异步条件 回调;回调 函数。 该 回调;回调 传递一个参数,即异步条件对象本身。
反射;反射
# *`基地。[医]父母模式`*-函数
parentmodule(m::Method) -> Module
返回给定方法所在的模块 m 被定义。
|
兼容性
朱莉娅1.9通过a |
parentmodule(f::Function, types) -> Module
确定包含泛型函数的第一个方法的模块 f 匹配指定的 类别.
parentmodule(f::Function) -> Module
确定包含泛型函数的(第一个)定义的模块。
parentmodule(t::DataType) -> Module
确定包含定义a的模块(可能 联合所有-包装) 数据类型.
*例子*
julia> module Foo
struct Int end
end
Foo
julia> parentmodule(Int)
Core
julia> parentmodule(Foo.Int)
Foo
parentmodule(m::Module) -> Module
获取模块的封闭 模块. 主要 是它自己的父母。
*例子*
julia> parentmodule(Main)
Main
julia> parentmodule(Base.Broadcast)
Base
# *`基地。pkg迪尔`*-Method
pkgdir(m::Module[, paths::String...])
返回声明模块的包的根目录 m,或 什么都没有 如果 m 没有在一个包中声明。 可选地,还可以提供进一步的路径组件字符串来构造包根目录内的路径。
要获取实现当前模块的包的根目录,请使用表单 pkgdir(@__模块__) 可以使用。
如果给出了扩展模块,则返回父包的根。
julia> pkgdir(Foo)
"/path/to/Foo.jl"
julia> pkgdir(Foo, "src", "file.jl")
"/path/to/Foo.jl/src/file.jl"
请参阅 [医路径].
|
兼容性
Julia1.7可选参数 |
# *`基地。pkgversion,pkgversion`*-Method
pkgversion(m::Module)
返回导入模块的包的版本 m,或 什么都没有 如果 m 不是从包导入的,也不是从没有设置版本字段的包导入的。
版本是从包的项目中读取的。包加载期间的toml。
要获取导入当前模块的包的版本,请使用表单 pkgversion(@__模块__) 可以使用。
|
兼容性
Julia1.9这个函数是在Julia1.9中引入的。 |
# *`基地。模块化`*-函数
moduleroot(m::Module) -> Module
查找给定模块的根模块。 这是父模块链中的第一个模块 m 它要么是注册的根模块,要么是它自己的父模块。
# *`基地。@__DIR__`*-马科罗_
@__DIR__ -> String
宏以字符串的形式获取当前目录的绝对路径。
如果在脚本中,则返回包含 @__DIR__ 宏观球。 如果从REPL运行或通过 朱莉娅-e<expr>,返回当前工作目录。
*例子*
这个例子说明了 @__DIR__ 和 残疾人士(),通过在与当前工作目录不同的目录中创建一个简单脚本并执行这两个命令:
julia> cd("/home/JuliaUser") # working directory
julia> # create script at /home/JuliaUser/Projects
open("/home/JuliaUser/Projects/test.jl","w") do io
print(io, """
println("@__DIR__ = ", @__DIR__)
println("pwd() = ", pwd())
""")
end
julia> # outputs script directory and current working directory
include("/home/JuliaUser/Projects/test.jl")
@__DIR__ = /home/JuliaUser/Projects
pwd() = /home/JuliaUser
# *`基地。全名`*-函数
fullname(m::Module)
获取模块的完全限定名称作为符号元组。 例如,
*例子*
julia> fullname(Base.Iterators)
(:Base, :Iterators)
julia> fullname(Main)
(:Main,)
# *`基地。姓名`*-函数
names(x::Module; all::Bool=false, imported::Bool=false, usings::Bool=false) -> Vector{Symbol}
获取a的公共名称的向量 模块,不包括已弃用的名称。 如果 全部 为true,那么该列表还包括在模块中定义的非公共名称,不推荐使用的名称和编译器生成的名称。 如果 进口 是真的,那么从其他模块显式导入的名称也包括在内。 如果 使用方法 为true,则通过以下方式显式或隐式导入名称 使用 也包括在内。 名称按排序顺序返回。
作为一个特例,所有定义在 主要 被认为是"公开的",因为明确地标记名称不是惯用的 主要 作为公众。
|
注 |
|
警告 |
|
兼容性
朱莉娅1.12 |
请参阅: 基地。isexported, 基地。公共的,公共的, 基地。@当地人, @__模块__.
# *`基地。公共的,公共的`*-函数
ispublic(m::Module, s::Symbol) -> Bool
返回一个符号是否在模块中标记为public。
导出的符号被认为是公共的。
|
兼容性
Julia1.11在Julia1.11中增加了这个功能和宣传的概念。 |
请参阅: isexported, 姓名
julia> module Mod
export foo
public bar
end
Mod
julia> Base.ispublic(Mod, :foo)
true
julia> Base.ispublic(Mod, :bar)
true
julia> Base.ispublic(Mod, :baz)
false
# *`基地。名称;名称`*-Method
nameof(f::Function) -> Symbol
获取泛型的名称 功能 作为符号。 对于匿名函数,这是编译器生成的名称。 对于显式声明的子类型 功能,它是函数类型的名称。
# *`基地。@当地人`*-马科罗_
@locals()
构造一个包含调用站点定义的所有局部变量的名称(作为符号)和值的字典。
|
兼容性
Julia1.1这个宏至少需要Julia1.1。 |
*例子*
julia> let x = 1, y = 2
Base.@locals
end
Dict{Symbol, Any} with 2 entries:
:y => 2
:x => 1
julia> function f(x)
local y
show(Base.@locals); println()
for i = 1:1
show(Base.@locals); println()
end
y = 2
show(Base.@locals); println()
nothing
end;
julia> f(42)
Dict{Symbol, Any}(:x => 42)
Dict{Symbol, Any}(:i => 1, :x => 42)
Dict{Symbol, Any}(:y => 2, :x => 42)
# *`核心。[医]全球球`*-函数
getglobal(module::Module, name::Symbol, [order::Symbol=:monotonic])
检索绑定的值 姓名 从模块 模块. 可选地,可以为操作定义原子排序,否则它默认为单调。
访问模块绑定时使用 盖菲尔德仍然支持保持兼容性,使用 [医]全球球 应始终首选,因为 [医]全球球 允许控制原子排序(盖菲尔德 总是单调的),并且更好地向用户和编译器表示代码的意图。
大多数用户不应该直接调用这个函数-- 获得财产函数或相应的语法(即 module.name)应该在除了少数非常具体的用例之外的所有情况下都是首选。
|
兼容性
Julia1.9此功能需要Julia1.9或更高版本。 |
请参阅 获得财产和 setglobal!.
*例子*
julia> a = 1
1
julia> module M
a = 2
end;
julia> getglobal(@__MODULE__, :a)
1
julia> getglobal(M, :a)
2
# *`核心。setglobal!`*-函数
setglobal!(module::Module, name::Symbol, x, [order::Symbol=:monotonic])
设置或更改绑定的值 姓名 在模块中 模块 到 x. 不执行类型转换,因此如果已经为绑定声明了类型, x 必须是适当的类型,否则会引发错误。
此外,可以为此操作指定原子排序,否则它默认为单调。
用户通常会通过 setproperty!函数或相应的语法(即 module.name =x)相反,所以这只适用于非常具体的用例。
|
兼容性
Julia1.9此功能需要Julia1.9或更高版本。 |
请参阅 setproperty!和 [医全球球]
*例子*
julia> module M; global a; end;
julia> M.a # same as `getglobal(M, :a)`
ERROR: UndefVarError: `a` not defined in `M`
Suggestion: add an appropriate import or assignment. This global was declared but not assigned.
Stacktrace:
[1] getproperty(x::Module, f::Symbol)
@ Base ./Base_compiler.jl:40
[2] top-level scope
@ none:1
julia> setglobal!(M, :a, 1)
1
julia> M.a
1
# *`核心。修改全球!`*-函数
modifyglobal!(module::Module, name::Symbol, op, x, [order::Symbol=:monotonic]) -> Pair
在应用函数后,原子地执行获取和设置全局的操作 op的.
|
兼容性
Julia1.11此功能需要Julia1.11或更高版本。 |
请参阅 modifyproperty!和 setglobal!.
# *`核心。swapglobal!`*-函数
swapglobal!(module::Module, name::Symbol, x, [order::Symbol=:monotonic])
原子地执行操作以同时获取和设置全局。
|
兼容性
Julia1.11此功能需要Julia1.11或更高版本。 |
请参阅 swapproperty!和 setglobal!.
# *`核心。setglobalonce!`*-函数
setglobalonce!(module::Module, name::Symbol, value,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> success::Bool
原子地执行将全局设置为给定值的操作,只有在以前未设置全局值的情况下。
|
兼容性
Julia1.11此功能需要Julia1.11或更高版本。 |
请参阅 setpropertyonce!和 setglobal!.
# *`核心。替换掉!`*-函数
replaceglobal!(module::Module, name::Symbol, expected, desired,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> (; old, success::Bool)
原子地执行操作以获取并有条件地将全局设置为给定值。
|
兼容性
Julia1.11此功能需要Julia1.11或更高版本。 |
请参阅 更换产品!和 setglobal!.
文件
(另请参阅 文档章节。)
# *`核心。@doc`*-马科罗_
*文件*
函数、方法和类型可以通过在定义之前放置一个字符串来记录:
"""
foo(x)
Return a fooified version of `x`.
"""
foo(x) = ...
该 @doc 宏可以直接用于设置和检索文档/元数据。 宏具有特殊的解析,以便记录的对象可能出现在下一行:
@doc "blah"
function foo() ...
默认情况下,文档编写为Markdown,但任何对象都可以用作第一个参数。
*将对象与其定义分开记录*
您可以在对象定义之前或之后使用
@doc "foo" function_to_doc
@doc "bar" TypeToDoc
对于宏,语法为 @doc"宏doc":(模块。@宏) 或 @doc"宏doc":(string_macro"") 对于字符串宏。 没有报价 :() 宏的扩展将被记录下来。
*检索文档*
您可以检索函数、宏和其他对象的文档,如下所示:
@doc foo
@doc @time
@doc md""
*功能和方法*
将文档放在方法定义之前(例如 函数foo()。.. 或 foo()=。..)将导致该特定方法被记录,而不是整个函数。 方法文档按照定义的顺序连接在一起,以便为函数提供文档。
# *`基地。文件。哈斯多克`*-函数
Docs.hasdoc(mod::Module, sym::Symbol)::Bool
回来吧 真的 如果 西姆 在 国防部 有一个docstring和 错误 否则。
# *`基地。文件。未记录的名称`*-函数
undocumented_names(mod::Module; private=false)
返回未记录符号的排序向量 模块 (即缺乏docstrings)。 私人=错误 (默认值)仅返回声明为 公众人士 和/或 出口,而 私人=真 返回模块中的所有符号(不包括编译器生成的以 #).
请参阅: 姓名, 文件。哈斯多克, 基地。公共的,公共的.
代码加载
# *`基地。标识_包装`*-函数
Base.identify_package(name::String)::Union{PkgId, Nothing}
Base.identify_package(where::Union{Module,PkgId}, name::String)::Union{PkgId, Nothing}
从当前环境堆栈中按其名称标识包,返回其 PkgId,PkgId,或 什么都没有 如果找不到。
如果只有 姓名 提供了参数,它搜索堆栈中的每个环境及其命名的直接依赖项。
该 哪里 argument提供了从哪里搜索包的上下文:在这种情况下,它首先检查名称是否与上下文本身匹配,否则它搜索所有递归依赖项(从每个环境的已解析清单中),直到 哪里,并从那里识别具有相应名称的依赖关系。
julia> Base.identify_package("Pkg") # Pkg is a dependency of the default environment
Pkg [44cfe95a-1eb2-52ea-b672-e2afdf69b78f]
julia> using LinearAlgebra
julia> Base.identify_package(LinearAlgebra, "Pkg") # Pkg is not a dependency of LinearAlgebra
# *`基地。isprecompiled的`*-函数
Base.isprecompiled(pkg::PkgId; ignore_loaded::Bool=false)
返回活动项目中的给定PkgId是否已预编译。
默认情况下,此检查遵循代码加载所采用的相同方法,即当前将不同版本的依赖项加载到预期的依赖项。 要忽略加载的模块并像在新的julia会话中那样回答指定 ignore_loaded=true.
|
兼容性
Julia1.10此功能至少需要Julia1.10。 |
# *`基地。get_extension`*-函数
get_extension(parent::Module, extension::Symbol)
返回模块 扩展 的 家长/家长 或返回 什么都没有 如果未加载扩展。
内部件
# *`基地。GC。gc`*-函数
GC.gc([full=true])
执行垃圾回收。 论点 全 确定集合的类型:完整集合(默认)遍历所有活动对象(即完整标记),并应从所有无法访问的对象中回收内存。 增量集合仅从无法访问的年轻对象中回收内存。
即使请求了增量收集,GC也可以决定执行完整收集。
|
警告过度使用可能会导致性能不佳。 |
# *`基地。GC。启用`*-函数
GC.enable(on::Bool)
使用布尔参数控制是否启用垃圾回收(真的 对于已启用, 错误 为残疾人士)。 返回以前的GC状态。
|
警告禁用垃圾回收应谨慎使用,因为它可能导致内存使用增长而不绑定。 |
# *`基地。GC。@保留`*-马科罗_
GC.@preserve x1 x2 ... xn expr
标记对象 x1,x2,。.. 在表达式的计算过程中作为_in use_ expr. 这只在不安全的代码中需要 expr _impl隐式使用内存或由其中一个拥有的其他资源 xs.
[计]用途 x 涵盖逻辑上拥有的资源的任何间接使用 x 编译器看不到的。 一些例子:
*直接通过访问对象的内存 Ptr
*将指针传递到 x 到 ccall
*使用 x 这将在终结器中清理。
@保留 在短暂延长对象生存期的典型用例中,通常不应该对性能产生任何影响。 在实施中, @保留 具有保护动态分配的对象免受垃圾回收等效果。
*例子*
当从指针加载与 卸载/卸载,底层对象被隐式地使用,例如 x 被隐式地使用 卸载(p) 在以下:
julia> let
x = Ref{Int}(101)
p = Base.unsafe_convert(Ptr{Int}, x)
GC.@preserve x unsafe_load(p)
end
101
当传递指针到 ccall,指向对象是隐式使用的,应该保留。 (但请注意,您通常应该只是通过 x 直接至 ccall 这是一个明确的使用。)
julia> let
x = "Hello"
p = pointer(x)
Int(GC.@preserve x @ccall strlen(p::Cstring)::Csize_t)
# Preferred alternative
Int(@ccall strlen(x::Cstring)::Csize_t)
end
5
# *`基地。GC。安全点`*-函数
GC.safepoint()
在程序中插入一个可能运行垃圾回收的点。
安全点很快,本身不会触发垃圾收集. 但是,如果另一个线程请求GC运行,则到达安全点将导致当前线程阻塞并等待GC。
在一些任务分配内存(因此可能需要运行GC)但其他任务只执行简单操作(没有分配,任务切换或I/O)的多线程程序中,这在极少数情况下非常有用,这些操作 在非分配任务中定期调用此函数允许垃圾回收运行。
请注意,即使安全点很快(通常在2个时钟周期左右),如果在紧密循环中调用,它们仍然会降低性能。
|
兼容性
Julia1.4此功能自Julia1.4起可用。 |
# *`基地。元。解析,解析`*-Method
parse(str, start; greedy=true, raise=true, depwarn=true, filename="none")
解析表达式字符串并返回一个表达式(稍后可以传递给eval执行)。 开始 是代码单元索引成 斯特拉 开始解析的第一个字符(与所有字符串索引一样,这些不是字符索引)。 如果 贪婪 是 真的 (默认), 解析,解析 将尝试消耗尽可能多的输入,否则,一旦解析了有效的表达式,它就会停止。 不完整但在语法上有效的表达式将返回 Expr(:不完整,"(错误消息)"). 如果 加薪 是 真的 (默认),不完整表达式以外的语法错误将引发错误。 如果 加薪 是 错误, 解析,解析 将返回一个表达式,该表达式将在计算时引发错误。 如果 德普瓦恩 是 错误,弃用警告将被抑制。 该 文件名 参数用于在引发错误时显示诊断。
julia> Meta.parse("(α, β) = 3, 5", 1) # start of string
(:((α, β) = (3, 5)), 16)
julia> Meta.parse("(α, β) = 3, 5", 1, greedy=false)
(:((α, β)), 9)
julia> Meta.parse("(α, β) = 3, 5", 16) # end of string
(nothing, 16)
julia> Meta.parse("(α, β) = 3, 5", 11) # index of 3
(:((3, 5)), 16)
julia> Meta.parse("(α, β) = 3, 5", 11, greedy=false)
(3, 13)
# *`基地。元。解析,解析`*-Method
parse(str; raise=true, depwarn=true, filename="none")
贪婪地解析表达式字符串,返回单个表达式。 如果第一个表达式后面有其他字符,则会引发错误。 如果 加薪 是 真的 (默认),语法错误将引发错误;否则, 解析,解析 将返回一个表达式,该表达式将在计算时引发错误。 如果 德普瓦恩 是 错误,弃用警告将被抑制。 该 文件名 参数用于在引发错误时显示诊断。
julia> Meta.parse("x = 3")
:(x = 3)
julia> Meta.parse("1.0.2")
ERROR: ParseError:
# Error @ none:1:1
1.0.2
└──┘ ── invalid numeric constant
[...]
朱莉娅>元。解析("1.0.2";提高=错误)
:($(Expr(:error, "invalid numeric constant "1.0."")))
朱莉娅>元。解析("x=")
:($(Expr(:incomplete, "incomplete: premature end of input")))
# *`基地。宏扩展`*-函数
macroexpand(m::Module, x; recursive=true)
取表达式 x 并返回一个等价表达式,其中删除(展开)所有宏以便在模块中执行 m. 该 递归 关键字控制是否也扩展嵌套宏的更深层次。 下面的示例演示了这一点:
julia> module M
macro m1()
42
end
macro m2()
:(@m1())
end
end
M
julia> macroexpand(M, :(@m2()), recursive=true)
42
julia> macroexpand(M, :(@m2()), recursive=false)
:(#= REPL[16]:6 =# M.@m1)
# *`基地。@macroexpand`*-马科罗_
@macroexpand [mod,] ex
返回删除(展开)所有宏的等效表达式。 如果提供了两个参数,则第一个是要计算的模块。
之间存在差异 @macroexpand 和 宏扩展.
*同时 宏扩展接受关键字参数 递归, @macroexpand 总是递归的。 有关非递归宏版本,请参阅 @macroexpand1.
*同时 宏扩展有明确的 模块 论点, @macroexpand 始终相对于调用它的模块展开。
这在以下示例中最好看到:
julia> module M
macro m()
1
end
function f()
(@macroexpand(@m),
macroexpand(M, :(@m)),
macroexpand(Main, :(@m))
)
end
end
M
julia> macro m()
2
end
@m (macro with 1 method)
julia> M.f()
(1, 1, 2)
与 @macroexpand 表达式在哪里展开 @macroexpand 出现在代码(模块 M 例中)。 与 宏扩展 表达式在作为第一个参数给出的模块中展开。
|
兼容性
Julia1.11双参数形式至少需要Julia1.11。 |
# *`基地。[医]鳕鱼`*-函数
code_lowered(f, types; generated=true, debuginfo=:default)
为匹配给定泛型函数和类型签名的方法返回降低形式(IR)的数组。
如果 生成的 是 错误,返回 代码信息 实例将对应于回退实现。 如果不存在回退实现,则会引发错误。 如果 生成的 是 真的,这些 代码信息 实例将对应于通过扩展生成器产生的方法体。
关键字 debuginfo,debuginfo 控制输出中存在的代码元数据量。
请注意,如果 类别 不是具体类型时 生成的 是 真的 和任何相应的方法是一个 @生成 方法。
# *`基地。代码类型`*-函数
code_typed(f, types; kw...)
返回匹配给定泛型函数和类型签名的方法的类型推断降低形式(IR)数组。
*关键字参数*
* 优化::Bool=true:可选,控制是否也应用其他优化,例如内联。
* debuginfo::符号=:默认值:可选,控制输出中存在的代码元数据的数量,可能的选项有 :资料来源 或 :无.
*内部关键字参数*
本节应该被认为是内部的,并且只适用于理解Julia编译器内部的人。
* 世界::UInt=基地。get_world_counter():可选,控制查找方法时使用的世界年龄,如果没有指定,请使用当前世界年龄。
* interp::核心。编译器。AbstractInterpreter=核心。编译器。NativeInterpreter(世界):可选,控制抽象解释器使用,如果未指定,请使用本机解释器。
*例子*
可以将参数类型放在元组中以获取相应的 代码类型.
julia> code_typed(+, (Float64, Float64))
1-element Vector{Any}:
CodeInfo(
1 ─ %1 = Base.add_float(x, y)::Float64
└── return %1
) => Float64
# *`基地。预编译`*-函数
precompile(f, argtypes::Tuple{Vararg{Any}}, m::Method)
预编译给定参数类型的特定方法。 这可以用于预编译与通常由dispatch选择的方法不同的方法,从而模拟 调用.
precompile(f, argtypes::Tuple{Vararg{Any}})
编译给定的函数 f 对于参数元组(类型) [医]银型,但不执行它。
# *`基地。jit_total_bytes`*-函数
Base.jit_total_bytes()
返回just-in-time编译器为例如本机代码和数据分配的总量(以字节为单位)。
元,元
# *`基地。isexpr`*-函数
Meta.isexpr(ex, head[, n])::Bool
回来吧 真的 如果 前 是一个 Expr 与给定的类型 头 并且可选的参数列表是长度的 n. 头 可能是一个 符号 或收集 符号例如,要检查宏是否传递了函数调用表达式,您可以使用 isexpr(ex,:呼叫).
*例子*
julia> ex = :(f(x))
:(f(x))
julia> Meta.isexpr(ex, :block)
false
julia> Meta.isexpr(ex, :call)
true
julia> Meta.isexpr(ex, [:block, :call]) # multiple possible heads
true
julia> Meta.isexpr(ex, :call, 1)
false
julia> Meta.isexpr(ex, :call, 2)
true
# *`基地。[医]科学`*-函数
isidentifier(s) -> Bool
返回符号还是字符串 s 包含在Julia代码中被解析为有效的普通标识符(不是二进制/一元运算符)的字符;另请参阅 基地。等效器,等效器.
内部Julia允许任何字符序列 符号 (除 \0s),并且宏自动使用包含 # 以避免与周围代码的命名冲突。 为了使解析器识别一个变量,它使用一组有限的字符(由Unicode大大扩展)。 科学() 使得可以直接查询解析器符号是否包含有效字符。
*例子*
julia> Meta.isidentifier(:x), Meta.isidentifier("1x")
(true, false)
# *`基地。等效器,等效器`*-函数
isoperator(s::Symbol)
回来吧 真的 如果符号可以用作运算符, 错误 否则。
*例子*
julia> Meta.isoperator(:+), Meta.isoperator(:f)
(true, false)
# *`基地。isunaryoperator臓臓`*-函数
isunaryoperator(s::Symbol)
回来吧 真的 如果符号可以用作一元(前缀)运算符, 错误 否则。
*例子*
julia> Meta.isunaryoperator(:-), Meta.isunaryoperator(:√), Meta.isunaryoperator(:f)
(true, true, false)
# *`基地。isbinaryoperator臓臓`*-函数
isbinaryoperator(s::Symbol)
回来吧 真的 如果符号可以用作二进制(中缀)运算符, 错误 否则。
*例子*
julia> Meta.isbinaryoperator(:-), Meta.isbinaryoperator(:√), Meta.isbinaryoperator(:f)
(true, false, false)
# *`基地。元。显示_sexpr`*-函数
Meta.show_sexpr([io::IO,], ex)
显示表达 前 作为lisp风格的s-表达式。
*例子*
julia> Meta.show_sexpr(:(f(x, g(y,z))))
(:call, :f, :x, (:call, :g, :y, :z))