Essentials
Introduction
تحتوي قاعدة جوليا على مجموعة من الدوال والماكرو المناسبة لأداء الحوسبة العلمية والعددية، ولكنها أيضًا واسعة مثل تلك الموجودة في العديد من لغات البرمجة العامة. تتوفر وظائف إضافية من مجموعة متزايدة من available packages. يتم تجميع الدوال حسب الموضوع أدناه.
بعض الملاحظات العامة:
- لاستخدام دوال الوحدة، استخدم
import Module
لاستيراد الوحدة، وModule.fn(x)
لاستخدام الدوال. - بدلاً من ذلك،
using Module
سيستورد جميع دوالModule
المصدرة إلى مساحة الأسماء الحالية. - بموجب الاتفاق، فإن أسماء الدوال التي تنتهي بعلامة التعجب (
!
) تعدل من وسائطها. بعض الدوال لديها نسخ تعديلية (مثلsort!
) وغير تعديلية (sort
).
سلوكيات Base
والمكتبات القياسية مستقرة كما هو محدد في SemVer فقط إذا كانت موثقة؛ أي، مدرجة في Julia documentation وليست معلمة على أنها غير مستقرة. راجع API FAQ لمزيد من المعلومات.
Getting Around
Base.exit
— Functionexit(code=0)
أوقف البرنامج مع رمز خروج. رمز الخروج الافتراضي هو صفر، مما يدل على أن البرنامج اكتمل بنجاح. في جلسة تفاعلية، يمكن استدعاء exit()
باستخدام اختصار لوحة المفاتيح ^D
.
Base.atexit
— Functionatexit(f)
قم بتسجيل دالة ذات صفر أو واحد من المعاملات f()
ليتم استدعاؤها عند خروج العملية. يتم استدعاء روابط atexit()
بترتيب آخر في أول خارج (LIFO) وتعمل قبل المنهيات الخاصة بالكائنات.
إذا كانت هناك طريقة معرفة لـ f
تأخذ معامل صحيح واحد، فسيتم استدعاؤها كـ f(n::Int32)
، حيث n
هو رمز الخروج الحالي، وإلا سيتم استدعاؤها كـ f()
.
يتطلب الشكل ذو المعامل الواحد Julia 1.9
يسمح لروابط الخروج باستدعاء exit(n)
، وفي هذه الحالة ستخرج Julia برمز الخروج n
(بدلاً من رمز الخروج الأصلي). إذا استدعت أكثر من رابط خروج exit(n)
، فستخرج Julia برمز الخروج الذي يتوافق مع آخر رابط خروج تم استدعاؤه والذي يستدعي exit(n)
. (نظرًا لأن روابط الخروج تُستدعى بترتيب LIFO، فإن "آخر استدعاء" يعادل "الأول المسجل").
ملاحظة: بمجرد استدعاء جميع روابط الخروج، لا يمكن تسجيل المزيد من روابط الخروج، وأي استدعاء لـ atexit(f)
بعد اكتمال جميع الروابط سيؤدي إلى رمي استثناء. قد تحدث هذه الحالة إذا كنت تسجل روابط خروج من مهام خلفية قد لا تزال تعمل بالتزامن أثناء الإغلاق.
Base.isinteractive
— Functionisinteractive() -> Bool
حدد ما إذا كانت جوليا تعمل في جلسة تفاعلية.
Base.summarysize
— FunctionBase.summarysize(obj; exclude=Union{...}, chargeall=Union{...}) -> Int
احسب مقدار الذاكرة، بالبايت، المستخدمة من قبل جميع الكائنات الفريدة القابلة للوصول من الوسيطة.
الوسائط الرئيسية
exclude
: يحدد أنواع الكائنات التي يجب استبعادها من التجوال.chargeall
: يحدد أنواع الكائنات التي يجب دائمًا احتساب حجم جميع حقولها، حتى لو كانت تلك الحقول ستستبعد عادةً.
انظر أيضًا sizeof
.
أمثلة
julia> Base.summarysize(1.0)
8
julia> Base.summarysize(Ref(rand(100)))
848
julia> sizeof(Ref(rand(100)))
8
Base.__precompile__
— Function__precompile__(isprecompilable::Bool)
حدد ما إذا كان الملف الذي يستدعي هذه الدالة قابلًا للتجميع المسبق، مع الافتراضي إلى true
. إذا كان الوحدة أو الملف ليس قابلًا للتجميع المسبق بشكل آمن، يجب أن يستدعي __precompile__(false)
من أجل إلقاء خطأ إذا حاولت جوليا تجميعه مسبقًا.
Base.include
— FunctionBase.include([mapexpr::Function,] m::Module, path::AbstractString)
قم بتقييم محتويات ملف المصدر المدخل في النطاق العالمي للوحدة m
. كل وحدة (باستثناء تلك المعرفة باستخدام baremodule
) لديها تعريف خاص بها لـ include
مع حذف وسيط m
، والذي يقوم بتقييم الملف في تلك الوحدة. يُرجع نتيجة آخر تعبير تم تقييمه من ملف الإدخال. أثناء التضمين، يتم تعيين مسار تضمين محلي للمهمة إلى الدليل الذي يحتوي على الملف. ستبحث المكالمات المتداخلة لـ include
بالنسبة لذلك المسار. تُستخدم هذه الوظيفة عادةً لتحميل المصدر بشكل تفاعلي، أو لدمج الملفات في الحزم التي تم تقسيمها إلى ملفات مصدر متعددة.
يمكن استخدام الوسيط الأول الاختياري mapexpr
لتحويل الكود المضمن قبل تقييمه: لكل تعبير تم تحليله expr
في path
، تقوم وظيفة include
فعليًا بتقييم mapexpr(expr)
. إذا تم حذفها، فإن mapexpr
الافتراضي هو identity
.
يتطلب الأمر وجود Julia 1.5 لتمرير وسيط mapexpr
.
include
— Functioninclude([mapexpr::Function,] path::AbstractString)
قم بتقييم محتويات ملف المصدر المدخل في النطاق العالمي للوحدة المحتوية. كل وحدة (باستثناء تلك المعرفة باستخدام baremodule
) لديها تعريف خاص بها لـ include
، والذي يقوم بتقييم الملف في تلك الوحدة. يُرجع نتيجة آخر تعبير تم تقييمه في ملف الإدخال. أثناء التضمين، يتم تعيين مسار تضمين محلي للمهمة إلى الدليل الذي يحتوي على الملف. ستبحث الاستدعاءات المتداخلة لـ include
بالنسبة لذلك المسار. تُستخدم هذه الوظيفة عادةً لتحميل المصدر بشكل تفاعلي، أو لدمج الملفات في الحزم التي تم تقسيمها إلى ملفات مصدر متعددة. يتم تطبيع الوسيطة path
باستخدام normpath
والتي ستحل رموز المسار النسبية مثل ..
وتحول /
إلى فاصل المسار المناسب.
يمكن استخدام الوسيطة الأولى الاختيارية mapexpr
لتحويل الكود المضمن قبل تقييمه: لكل تعبير تم تحليله expr
في path
، تقوم وظيفة include
فعليًا بتقييم mapexpr(expr)
. إذا تم حذفها، فإن mapexpr
الافتراضي هو identity
.
استخدم Base.include
لتقييم ملف في وحدة أخرى.
يتطلب الأمر Julia 1.5 لتمرير وسيطة mapexpr
.
Base.include_string
— Functioninclude_string([mapexpr::Function,] m::Module, code::AbstractString, filename::AbstractString="string")
مثل include
، باستثناء أنه يقرأ الكود من السلسلة المعطاة بدلاً من ملف.
يمكن استخدام الوسيط الأول الاختياري mapexpr
لتحويل الكود المضمن قبل تقييمه: لكل تعبير تم تحليله expr
في code
، تقوم دالة include_string
فعليًا بتقييم mapexpr(expr)
. إذا تم حذفها، فإن mapexpr
يكون افتراضيًا على identity
.
يتطلب وجود Julia 1.5 لتمرير وسيط mapexpr
.
Base.include_dependency
— Functioninclude_dependency(path::AbstractString; track_content::Bool=true)
في وحدة، أعلن أن الملف أو الدليل أو الرابط الرمزي المحدد بواسطة path
(نسبي أو مطلق) هو اعتماد للتجميع المسبق؛ أي، إذا كان track_content=true
، ستحتاج الوحدة إلى إعادة التجميع إذا تغير محتوى path
(إذا كان path
دليلاً، فإن المحتوى يساوي join(readdir(path))
). إذا كان track_content=false
، يتم تفعيل إعادة التجميع عندما يتغير وقت التعديل mtime
لـ path
.
هذا مطلوب فقط إذا كانت وحدتك تعتمد على مسار غير مستخدم عبر include
. ليس له تأثير خارج التجميع.
يتطلب وسيط track_content
على الأقل Julia 1.11. يتم الآن طرح خطأ إذا كان path
غير قابل للقراءة.
__init__
— Keyword__init__
تقوم دالة __init__()
في وحدة ما بالتنفيذ فورًا بعد تحميل الوحدة في وقت التشغيل للمرة الأولى. يتم استدعاؤها مرة واحدة، بعد تنفيذ جميع العبارات الأخرى في الوحدة. نظرًا لأنها تُستدعى بعد استيراد الوحدة بالكامل، سيتم تنفيذ دوال __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
Base.which
— Methodwhich(f, types)
يُرجع الطريقة لـ f
(كائن Method
) التي سيتم استدعاؤها للوسائط من الأنواع المعطاة types
.
إذا كانت types
نوعًا مجردًا، فسيتم إرجاع الطريقة التي سيتم استدعاؤها بواسطة invoke
.
انظر أيضًا: parentmodule
, @which
، و @edit
.
Base.methods
— Functionmethods(f, [types], [module])
ارجع جدول الطرق لـ f
.
إذا تم تحديد types
، ارجع مصفوفة من الطرق التي تتطابق أنواعها. إذا تم تحديد module
، ارجع مصفوفة من الطرق المعرفة في تلك الوحدة. يمكن أيضًا تحديد قائمة من الوحدات كمصفوفة.
يتطلب الأمر على الأقل Julia 1.4 لتحديد وحدة.
انظر أيضًا: which
، @which
و methodswith
.
Base.@show
— Macro@show exs...
يظهر تعبيرًا أو أكثر، ونتائجها، إلى stdout
، ويعيد آخر نتيجة.
انظر أيضًا: show
، @info
، println
.
أمثلة
julia> x = @show 1+2
1 + 2 = 3
3
julia> @show x^2 x/2;
x ^ 2 = 9
x / 2 = 1.5
Base.MainInclude.ans
— Constantans
متغير يشير إلى آخر قيمة تم حسابها، يتم استيراده تلقائيًا إلى موجه التفاعل.
Base.MainInclude.err
— Constanterr
متغير يشير إلى آخر الأخطاء التي تم طرحها، يتم استيراده تلقائيًا إلى موجه التفاعل. يتم جمع الأخطاء المطروحة في مكدس من الاستثناءات.
Base.active_project
— Functionactive_project()
إرجاع مسار ملف Project.toml
النشط. انظر أيضًا Base.set_active_project
.
Base.set_active_project
— Functionset_active_project(projfile::Union{AbstractString,Nothing})
قم بتعيين ملف Project.toml
النشط إلى projfile
. انظر أيضًا Base.active_project
.
تتطلب هذه الوظيفة على الأقل جوليا 1.8.
Keywords
هذه هي قائمة الكلمات المحجوزة في جوليا: baremodule
، begin
، break
، catch
، const
، continue
، do
، else
، elseif
، end
، export
، false
، finally
، for
، function
، global
، if
، import
، let
، local
، macro
، module
، quote
، return
، struct
، true
، try
، using
، while
. لا يُسمح باستخدام هذه الكلمات كأسماء متغيرات.
تسلسلات الكلمات المكونة من كلمتين التالية محجوزة: abstract type
، mutable struct
، primitive type
. ومع ذلك، يمكنك إنشاء متغيرات بأسماء: abstract
، mutable
، primitive
و type
.
أخيرًا: where
يتم تحليله كعامل وسطى لكتابة تعريفات الطرق والمعلمات؛ in
و isa
يتم تحليلهما كعوامل وسطى؛ public
يتم تحليله ككلمة رئيسية عند بدء بيان على المستوى الأعلى؛ outer
يتم تحليله ككلمة رئيسية عند استخدامها لتعديل نطاق متغير في مواصفة تكرار لدورة for
؛ و as
تُستخدم ككلمة رئيسية لإعادة تسمية معرف تم إدخاله في النطاق بواسطة import
أو using
. يُسمح بإنشاء متغيرات تحمل أسماء where
و in
و isa
و outer
و as
، على الرغم من ذلك.
module
— Keywordmodule
module
يعلن عن Module
، وهو مساحة عمل متغيرة عالمية منفصلة. داخل وحدة، يمكنك التحكم في الأسماء من الوحدات الأخرى التي تكون مرئية (عبر الاستيراد)، وتحديد أي من أسمائك مقصود بها أن تكون عامة (عبر export
و public
). تسمح لك الوحدات بإنشاء تعريفات على المستوى الأعلى دون القلق بشأن تعارض الأسماء عندما يتم استخدام كودك مع كود شخص آخر. راجع قسم الدليل حول الوحدات لمزيد من التفاصيل.
أمثلة
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
export
— Keywordexport
export
يُستخدم داخل الوحدات لإخبار جوليا بأي الأسماء يجب أن تكون متاحة للمستخدم. على سبيل المثال: export foo
يجعل الاسم foo
متاحًا عند using
الوحدة. راجع قسم الدليل حول الوحدات للحصول على التفاصيل.
public
— Keywordpublic
public
يُستخدم داخل الوحدات لإخبار جوليا بأي الأسماء هي جزء من واجهة برمجة التطبيقات العامة للوحدة. على سبيل المثال: public foo
تشير إلى أن الاسم foo
هو عام، دون جعله متاحًا عند using
الوحدة. راجع قسم الدليل حول الوحدات للحصول على التفاصيل.
تم إضافة الكلمة الرئيسية public في جوليا 1.11. قبل ذلك، كانت فكرة العمومية أقل وضوحًا.
import
— Keywordimport
import Foo
سيقوم بتحميل الوحدة أو الحزمة Foo
. يمكن الوصول إلى الأسماء من الوحدة المستوردة Foo
باستخدام صيغة النقطة (على سبيل المثال Foo.foo
للوصول إلى الاسم foo
). راجع القسم الخاص بالوحدات للحصول على التفاصيل.
using
— Keywordusing
using Foo
سيقوم بتحميل الوحدة أو الحزمة Foo
ويجعل أسماءها export
متاحة للاستخدام المباشر. يمكن أيضًا استخدام الأسماء عبر بناء جملة النقطة (على سبيل المثال Foo.foo
للوصول إلى الاسم foo
)، سواء كانت export
ed أم لا. راجع قسم الدليل حول الوحدات للحصول على التفاصيل.
عندما تقوم حزم/وحدات متعددة بتصدير اسم ولا يشير هذا الاسم إلى نفس الشيء في كل من الحزم، ويتم تحميل الحزم عبر using
دون قائمة صريحة بالأسماء، فإنه من الخطأ الإشارة إلى ذلك الاسم دون تأهيل. لذلك يُوصى بأن يقوم الكود الذي يهدف إلى أن يكون متوافقًا مع الإصدارات المستقبلية من تبعياته ومن جوليا، مثل الكود في الحزم المصدرة، بإدراج الأسماء التي يستخدمها من كل حزمة محملة، على سبيل المثال، using Foo: Foo, f
بدلاً من using Foo
.
as
— Keywordas
as
يُستخدم ككلمة رئيسية لإعادة تسمية مُعرف تم جلبه إلى النطاق بواسطة import
أو using
، بغرض تجاوز تعارض الأسماء وكذلك لتقصير الأسماء. (خارج عبارات import
أو using
، as
ليست كلمة رئيسية ويمكن استخدامها كمُعرف عادي.)
import LinearAlgebra as LA
يجلب مكتبة LinearAlgebra
القياسية المستوردة إلى النطاق كـ LA
.
import LinearAlgebra: eigen as eig, cholesky as chol
يجلب طرق eigen
و cholesky
من LinearAlgebra
إلى النطاق كـ eig
و chol
على التوالي.
as
يعمل مع using
فقط عندما يتم جلب مُعرفات فردية إلى النطاق. على سبيل المثال، using LinearAlgebra: eigen as eig
أو using LinearAlgebra: eigen as eig, cholesky as chol
يعمل، لكن using LinearAlgebra as LA
هو بناء جملة غير صالح، لأنه غير منطقي إعادة تسمية جميع الأسماء المصدرة من LinearAlgebra
إلى LA
.
baremodule
— Keywordbaremodule
baremodule
يعلن عن وحدة لا تحتوي على using Base
أو تعريفات محلية لـ eval
و include
. ومع ذلك، فإنه لا يزال يستورد Core
. بعبارة أخرى،
module Mod
...
end
يعادل
baremodule Mod
using Base
eval(x) = Core.eval(Mod, x)
include(p) = Base.include(Mod, p)
...
end
function
— Keywordfunction
تُعرَف الدوال باستخدام الكلمة المفتاحية function
:
function add(a, b)
return a + b
end
أو باستخدام صيغة مختصرة:
add(a, b) = a + b
استخدام كلمة return
هو بالضبط كما في لغات أخرى، ولكنه غالبًا ما يكون اختياريًا. ستعيد الدالة التي لا تحتوي على عبارة return
صريحة التعبير الأخير في جسم الدالة.
macro
— Keywordmacro
macro
يُعرّف طريقة لإدراج الشيفرة المُولّدة في برنامج. يقوم الماكرو بربط تسلسل من تعبيرات الوسائط بتعبير مُرجع، ويتم استبدال التعبير الناتج مباشرة في البرنامج في النقطة التي يتم فيها استدعاء الماكرو. تُعتبر الماكروز وسيلة لتشغيل الشيفرة المُولّدة دون الحاجة لاستدعاء eval
، حيث تصبح الشيفرة المُولّدة ببساطة جزءًا من البرنامج المحيط. قد تتضمن وسائط الماكرو تعبيرات، قيم حرفية، ورموز. يمكن تعريف الماكروز لعدد متغير من الوسائط (varargs)، لكنها لا تقبل وسائط الكلمات الرئيسية. كل ماكرو يحصل أيضًا بشكل ضمني على الوسائط __source__
، التي تحتوي على رقم السطر واسم الملف الذي تم استدعاء الماكرو منه، و __module__
، الذي هو الوحدة التي يتم توسيع الماكرو فيها.
راجع قسم الدليل حول Metaprogramming لمزيد من المعلومات حول كيفية كتابة ماكرو.
أمثلة
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
— Keywordreturn
return x
يؤدي إلى خروج الدالة المحيطة مبكرًا، مع تمرير القيمة المعطاة x
إلى المتصل بها. return
بمفردها بدون قيمة تعادل return nothing
(انظر nothing
).
function compare(a, b)
a == b && return "equal to"
a < b ? "less than" : "greater than"
end
بشكل عام، يمكنك وضع عبارة return
في أي مكان داخل جسم الدالة، بما في ذلك داخل الحلقات أو الشروط المتداخلة بعمق، ولكن كن حذرًا مع كتل do
. على سبيل المثال:
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
في المثال الأول، تقوم عبارة return
بالخروج من test1
بمجرد أن تصادف عددًا زوجيًا، لذا فإن test1([5,6,7])
تعيد 12
.
قد تتوقع أن المثال الثاني سيتصرف بنفس الطريقة، ولكن في الواقع، فإن return
هناك تخرج فقط من الدالة الداخلية (داخل كتلة do
) وتعيد قيمة إلى map
. لذا فإن test2([5,6,7])
تعيد [5,12,7]
.
عند استخدامها في تعبير على المستوى الأعلى (أي خارج أي دالة)، فإن return
تتسبب في إنهاء التعبير الحالي على المستوى الأعلى بالكامل مبكرًا.
do
— Keywordافعل
أنشئ دالة مجهولة ومررها كأول وسيط لاستدعاء دالة. على سبيل المثال:
map(1:10) do x
2x
end
يعادل map(x->2x, 1:10)
.
استخدم وسائط متعددة كما يلي:
map(1:10, 11:20) do x, y
x + y
end
begin
— Keywordbegin
begin...end
يدل على كتلة من الشيفرة.
begin
println("Hello, ")
println("World!")
end
عادةً لن تكون begin
ضرورية، حيث أن الكلمات الرئيسية مثل function
و let
تبدأ بشكل ضمني كتل الشيفرة. انظر أيضًا ;
.
يمكن أيضًا استخدام begin
عند الفهرسة لتمثيل الفهرس الأول لمجموعة أو الفهرس الأول بعدد من أبعاد مصفوفة. على سبيل المثال، a[begin]
هو العنصر الأول من مصفوفة a
.
يتطلب استخدام begin
كمؤشر وجود Julia 1.4 أو أحدث.
أمثلة
julia> A = [1 2; 3 4]
2×2 Array{Int64,2}:
1 2
3 4
julia> A[begin, :]
2-element Array{Int64,1}:
1
2
end
— Keywordend
end
يشير إلى نهاية كتلة من التعبيرات، على سبيل المثال module
، struct
، mutable struct
، begin
، let
، for
إلخ.
يمكن أيضًا استخدام end
عند الفهرسة لتمثيل آخر فهرس لمجموعة أو آخر فهرس بعدد من أبعاد مصفوفة.
أمثلة
julia> A = [1 2; 3 4]
2×2 Array{Int64, 2}:
1 2
3 4
julia> A[end, :]
2-element Array{Int64, 1}:
3
4
let
— Keywordlet
تقوم كتل let
بإنشاء نطاق صعب جديد وتقديم ارتباطات محلية جديدة بشكل اختياري.
تمامًا مثل الإنشاءات النطاقية الأخرى، تحدد كتل let
كتلة الكود حيث تكون المتغيرات المحلية الجديدة المقدمة متاحة. بالإضافة إلى ذلك، فإن بناء الجملة له معنى خاص للتعيينات المفصولة بفواصل وأسماء المتغيرات التي قد تظهر اختياريًا في نفس السطر مع let
:
let var1 = value1, var2, var3 = value3
code
end
المتغيرات المقدمة في هذا السطر محلية لكتلة let
ويتم تقييم التعيينات بالترتيب، مع تقييم كل جانب أيمن في النطاق دون النظر إلى الاسم على الجانب الأيسر. لذلك من المنطقي كتابة شيء مثل let x = x
، حيث أن المتغيرين x
متميزان مع تظليل الجانب الأيسر محليًا لـ x
من النطاق الخارجي. يمكن أن تكون هذه حتى عبارة مفيدة حيث يتم إنشاء متغيرات محلية جديدة في كل مرة يتم فيها دخول النطاقات المحلية، ولكن هذا يمكن ملاحظته فقط في حالة المتغيرات التي تعيش بعد نطاقها عبر الإغلاقات. متغير let
بدون تعيين، مثل var2
في المثال أعلاه، يعلن عن متغير محلي جديد لم يتم ربطه بعد بقيمة.
بالمقابل، تقوم كتل begin
أيضًا بتجميع تعبيرات متعددة معًا ولكنها لا تقدم نطاقًا أو تحتوي على بناء جملة تعيين خاص.
أمثلة
في الدالة أدناه، يوجد x
واحد يتم تحديثه بشكل تكراري ثلاث مرات بواسطة map
. جميع الإغلاقات المرجعة تشير إلى ذلك 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
إذا، مع ذلك، أضفنا كتلة let
التي تقدم متغير محلي جديد، سننتهي بثلاث متغيرات متميزة يتم التقاطها (واحدة في كل تكرار) على الرغم من أننا اخترنا استخدام (تظليل) نفس الاسم.
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
تتصرف جميع الإنشاءات النطاقية التي تقدم متغيرات محلية جديدة بهذه الطريقة عند تشغيلها بشكل متكرر؛ السمة المميزة لـ let
هي قدرتها على إعلان local
s جديدة بشكل مختصر قد تظلل المتغيرات الخارجية بنفس الاسم. على سبيل المثال، يؤدي استخدام وسيط دالة do
مباشرة إلى التقاط ثلاث متغيرات متميزة:
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
— Keywordif/elseif/else
if
/elseif
/else
يقوم بإجراء تقييم شرطي، مما يسمح لأجزاء من الشيفرة أن تُقيّم أو لا تُقيّم اعتمادًا على قيمة تعبير بولي. إليك بنية صياغة الشرط if
/elseif
/else
:
if x < y
println("x أقل من y")
elseif x > y
println("x أكبر من y")
else
println("x يساوي y")
end
إذا كان تعبير الشرط x < y
صحيحًا، فإن الكتلة المقابلة تُقيّم؛ وإلا يتم تقييم تعبير الشرط x > y
، وإذا كان صحيحًا، يتم تقييم الكتلة المقابلة؛ إذا لم يكن أي من التعبيرين صحيحًا، يتم تقييم كتلة else
. كتل elseif
و else
اختيارية، ويمكن استخدام العديد من كتل elseif
كما هو مرغوب.
على عكس بعض اللغات الأخرى، يجب أن تكون الشروط من نوع Bool
. لا يكفي أن تكون الشروط قابلة للتحويل إلى Bool
.
julia> if 1 end
ERROR: TypeError: non-boolean (Int64) used in boolean context
for
— Keywordلـ
لـ
الحلقات تقيم كتلة من العبارات بشكل متكرر أثناء التكرار على تسلسل من القيم.
تكون متغيرات التكرار دائمًا متغيرات جديدة، حتى لو كان هناك متغير بنفس الاسم موجود في النطاق المحيط. استخدم outer
لإعادة استخدام متغير محلي موجود للتكرار.
أمثلة
julia> لـ i في [1, 4, 0]
println(i)
end
1
4
0
while
— Keywordبينما
بينما
الحلقات تقيم تعبيرًا شرطيًا بشكل متكرر، وتستمر في تقييم جسم حلقة بينما طالما أن التعبير يبقى صحيحًا. إذا كان تعبير الشرط خاطئًا عند الوصول إلى حلقة بينما لأول مرة، فلن يتم تقييم الجسم أبدًا.
أمثلة
julia> i = 1
1
julia> بينما i < 5
println(i)
global i += 1
end
1
2
3
4
break
— Keywordbreak
اخرج من الحلقة على الفور.
أمثلة
julia> i = 0
0
julia> while true
global i += 1
i > 5 && break
println(i)
end
1
2
3
4
5
continue
— Keywordتابع
تخطى بقية تكرار الحلقة الحالية.
أمثلة
julia> for i = 1:6
iseven(i) && continue
println(i)
end
1
3
5
try
— Keywordtry/catch
عبارة try
/catch
تسمح بالتقاط الأخطاء (الاستثناءات) التي يتم طرحها بواسطة throw
بحيث يمكن أن تستمر تنفيذ البرنامج. على سبيل المثال، الكود التالي يحاول كتابة ملف، ولكنه يحذر المستخدم ويتابع بدلاً من إنهاء التنفيذ إذا لم يكن بالإمكان كتابة الملف:
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
تقوم الصيغة catch e
(حيث e
هو أي متغير) بتعيين كائن الاستثناء الذي تم طرحه إلى المتغير المعطى داخل كتلة catch
.
تكمن قوة بناء try
/catch
في القدرة على فك حساب متداخل بعمق على الفور إلى مستوى أعلى بكثير في مكدس الدوال المستدعية.
finally
— Keywordأخيرًا
قم بتشغيل بعض التعليمات البرمجية عند خروج كتلة معينة من التعليمات البرمجية، بغض النظر عن كيفية خروجها. على سبيل المثال، إليك كيف يمكننا ضمان إغلاق ملف مفتوح:
f = open("file")
try
operate_on_file(f)
finally
close(f)
end
عندما يغادر التحكم كتلة try
(على سبيل المثال، بسبب return
، أو مجرد الانتهاء بشكل طبيعي)، سيتم تنفيذ close(f)
. إذا خرجت كتلة try
بسبب استثناء، سيستمر الاستثناء في الانتشار. يمكن دمج كتلة catch
مع try
و finally
أيضًا. في هذه الحالة، ستعمل كتلة finally
بعد أن تتعامل catch
مع الخطأ.
quote
— Keywordquote
quote
ينشئ كائنات تعبير متعددة في كتلة دون استخدام المُنشئ الصريح Expr
. على سبيل المثال:
ex = quote
x = 1
y = 2
x + y
end
على عكس الوسائل الأخرى للاقتباس، :( ... )
، هذه الصيغة تُدخل عناصر QuoteNode
إلى شجرة التعبير، والتي يجب أخذها في الاعتبار عند التلاعب مباشرة بالشجرة. لأغراض أخرى، يتم التعامل مع :( ... )
و quote .. end
ككتل متطابقة.
local
— Keywordمحلي
محلي
يقدم متغير محلي جديد. راجع قسم الدليل حول نطاق المتغيرات لمزيد من المعلومات.
أمثلة
julia> function foo(n)
x = 0
for i = 1:n
local x # تقديم x محلي في الحلقة
x = i
end
x
end
foo (دالة عامة تحتوي على 1 طريقة)
julia> foo(10)
0
global
— Keywordglobal
global x
يجعل x
في النطاق الحالي ونطاقاته الداخلية تشير إلى المتغير العالمي بالاسم نفسه. راجع manual section on variable scoping لمزيد من المعلومات.
أمثلة
julia> z = 3
3
julia> function foo()
global z = 6 # استخدم المتغير z المعرف خارج foo
end
foo (generic function with 1 method)
julia> foo()
6
julia> z
6
outer
— Keywordلـ `for outer`
إعادة استخدام متغير محلي موجود للتكرار في حلقة for
.
انظر إلى قسم الدليل حول نطاق المتغيرات لمزيد من المعلومات.
انظر أيضًا for
.
أمثلة
julia> function f()
i = 0
for i = 1:3
# فارغ
end
return i
end;
julia> f()
0
julia> function f()
i = 0
for outer i = 1:3
# فارغ
end
return i
end;
julia> f()
3
julia> i = 0 # متغير عالمي
for outer i = 1:3
end
ERROR: syntax: no outer local variable declaration exists for "for outer"
[...]
const
— Keywordconst
const
يُستخدم لإعلان المتغيرات العالمية التي لن تتغير قيمها. في معظم الأكواد (وخاصة الأكواد الحساسة للأداء) يجب أن تُعلن المتغيرات العالمية كثوابت بهذه الطريقة.
const x = 5
يمكن إعلان متغيرات متعددة ضمن const
واحد:
const y, z = 7, 11
لاحظ أن const
ينطبق فقط على عملية =
واحدة، لذلك const x = y = 1
يُعلن أن x
ثابت ولكن ليس y
. من ناحية أخرى، const x = const y = 1
يُعلن أن كلا من x
و y
ثابتين.
لاحظ أن "ثبات" المتغير لا يمتد إلى الحاويات القابلة للتغيير؛ فقط الارتباط بين المتغير وقيمته هو الثابت. إذا كان x
مصفوفة أو قاموس (على سبيل المثال) يمكنك still تعديل، إضافة، أو إزالة عناصر.
في بعض الحالات، تغيير قيمة متغير const
يعطي تحذيرًا بدلاً من خطأ. ومع ذلك، يمكن أن ينتج عن ذلك سلوك غير متوقع أو فساد حالة برنامجك، لذا يجب تجنبه. هذه الميزة مُخصصة فقط للراحة أثناء الاستخدام التفاعلي.
struct
— Keywordstruct
أكثر أنواع البيانات استخدامًا في جوليا هو الهيكل (struct)، الذي يتم تحديده كاسم ومجموعة من الحقول.
struct Point
x
y
end
يمكن أن تحتوي الحقول على قيود نوعية، والتي يمكن أن تكون معلمة:
struct Point{X}
x::X
y::Float64
end
يمكن أيضًا للهيكل أن يعلن عن نوع سوبر تجريدي عبر بناء جملة <:
:
struct Point <: AbstractPoint
x
y
end
الـ struct
s غير قابلة للتغيير بشكل افتراضي؛ لا يمكن تعديل مثيل من هذه الأنواع بعد الإنشاء. استخدم mutable struct
بدلاً من ذلك للإعلان عن نوع يمكن تعديل مثيلاته.
راجع قسم الدليل حول Composite Types لمزيد من التفاصيل، مثل كيفية تعريف المنشئات.
mutable struct
— Keywordmutable struct
mutable struct
مشابه لـ struct
، ولكنه يسمح أيضًا بتعيين حقول النوع بعد الإنشاء.
يمكن وضع علامة على الحقول الفردية في هيكل قابل للتغيير كـ const
لجعلها غير قابلة للتغيير:
mutable struct Baz
a::Int
const b::Float64
end
تتطلب الكلمة الرئيسية const
لحقول الهياكل القابلة للتغيير على الأقل Julia 1.8.
راجع قسم الدليل حول أنواع المركبات لمزيد من المعلومات.
Base.@kwdef
— Macro@kwdef typedef
هذه ماكرو مساعد يقوم تلقائيًا بتعريف مُنشئ يعتمد على الكلمات الرئيسية لنوع البيانات المُعلن عنه في التعبير typedef
، والذي يجب أن يكون تعبير struct
أو mutable struct
. يتم توفير الوسيط الافتراضي عن طريق إعلان الحقول بالشكل field::T = default
أو field = default
. إذا لم يتم توفير افتراضي، فإن وسيط الكلمة الرئيسية يصبح وسيطًا مطلوبًا في مُنشئ النوع الناتج.
لا يزال يمكن تعريف المُنشئات الداخلية، ولكن يجب أن يقبل واحد على الأقل الوسائط بنفس شكل المُنشئ الداخلي الافتراضي (أي وسيط موضعي واحد لكل حقل) لكي يعمل بشكل صحيح مع المُنشئ الخارجي المعتمد على الكلمات الرئيسية.
Base.@kwdef
للهيكليات المعاملية، والهيكليات ذات الأنواع العليا تتطلب على الأقل Julia 1.1.
تم تصدير هذه الماكرو اعتبارًا من Julia 1.9.
أمثلة
julia> @kwdef struct Foo
a::Int = 1 # الافتراضي المحدد
b::String # كلمة رئيسية مطلوبة
end
Foo
julia> Foo(b="hi")
Foo(1, "hi")
julia> Foo()
ERROR: UndefKeywordError: الوسيط الكلمة الرئيسية `b` غير مُعين
Stacktrace:
[...]
abstract type
— Keywordنوع مجرد
نوع مجرد
يعلن عن نوع لا يمكن إنشاؤه، ويعمل فقط كنقطة في رسم النوع، وبالتالي يصف مجموعات من الأنواع الملموسة ذات الصلة: تلك الأنواع الملموسة التي هي من نسلها. تشكل الأنواع المجردة التسلسل الهرمي المفاهيمي الذي يجعل نظام نوع جوليا أكثر من مجرد مجموعة من تنفيذات الكائنات. على سبيل المثال:
abstract type Number end
abstract type Real <: Number end
Number
ليس له نوع أعلى، بينما Real
هو نوع مجرد فرعي من Number
.
primitive type
— Keywordنوع بدائي
نوع بدائي
يعلن عن نوع ملموس يتكون بياناته فقط من سلسلة من البتات. الأمثلة الكلاسيكية للأنواع البدائية هي الأعداد الصحيحة والقيم العائمة. بعض أمثلة إعلانات الأنواع البدائية المدمجة:
primitive type Char 32 end
primitive type Bool <: Integer 8 end
الرقم بعد الاسم يشير إلى عدد بتات التخزين التي يتطلبها النوع. حاليًا، يتم دعم الأحجام التي هي مضاعفات لـ 8 بت فقط. إعلان Bool
يظهر كيف يمكن إعلان نوع بدائي ليكون اختياريًا نوعًا فرعيًا من نوع أعلى.
where
— Keywordwhere
تُنشئ الكلمة الرئيسية where
نوع UnionAll
، والذي يمكن اعتباره اتحادًا متكررًا لأنواع أخرى، على جميع قيم متغير ما. على سبيل المثال، Vector{T} where T<:Real
يتضمن جميع Vector
s حيث نوع العنصر هو نوع من الأرقام Real
.
يكون الحد الافتراضي للمتغير هو Any
إذا تم حذفه:
Vector{T} where T # اختصار لـ `where T<:Any`
يمكن أن تحتوي المتغيرات أيضًا على حدود دنيا:
Vector{T} where T>:Int
Vector{T} where Int<:T<:Real
هناك أيضًا صياغة مختصرة للتعبيرات المتداخلة where
. على سبيل المثال، هذا:
Pair{T, S} where S<:Array{T} where T<:Number
يمكن اختصاره إلى:
Pair{T, S} where {T<:Number, S<:Array{T}}
توجد هذه الصيغة غالبًا في توقيعات الطرق.
لاحظ أنه في هذه الصيغة، يتم سرد المتغيرات من الخارج إلى الداخل. يتطابق هذا مع الترتيب الذي يتم فيه استبدال المتغيرات عندما يتم "تطبيق" نوع على قيم المعلمات باستخدام الصيغة T{p1, p2, ...}
.
...
— Keyword...
يمثل عامل "السلات" ...
تسلسلًا من الوسائط. يمكن استخدام ...
في تعريفات الدوال، للإشارة إلى أن الدالة تقبل عددًا غير محدد من الوسائط. يمكن أيضًا استخدام ...
لتطبيق دالة على تسلسل من الوسائط.
أمثلة
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
;
— Keyword;
;
له دور مشابه في جوليا كما هو الحال في العديد من لغات C-like، ويستخدم لتحديد نهاية العبارة السابقة.
;
ليس ضروريًا في نهاية السطر، ولكن يمكن استخدامه لفصل العبارات في سطر واحد أو لدمج العبارات في تعبير واحد.
إضافة ;
في نهاية سطر في REPL ستمنع طباعة نتيجة ذلك التعبير.
في إعلانات الدوال، وبدلاً من ذلك في الاستدعاءات، ;
تفصل بين المعاملات العادية والكلمات الرئيسية.
في الأدبيات المصفوفية، المعاملات المفصولة بفواصل منقوطة يتم دمج محتوياتها معًا. فاصل مكون من ;
واحد يدمج عموديًا (أي على طول البعد الأول)، ;;
يدمج أفقيًا (البعد الثاني)، ;;;
يدمج على طول البعد الثالث، وهكذا. يمكن أيضًا استخدام مثل هذا الفاصل في الموضع الأخير في الأقواس المربعة لإضافة أبعاد متبقية بطول 1.
يمكن استخدام ;
في الموضع الأول داخل الأقواس لإنشاء مجموعة مسماة. نفس بناء الجملة (; ...)
على الجانب الأيسر من تعيين يسمح بتفكيك الخصائص.
في REPL القياسي، كتابة ;
في سطر فارغ ستبدل إلى وضع الشل.
أمثلة
julia> function foo()
x = "Hello, "; x *= "World!"
return x
end
foo (generic function with 1 method)
julia> bar() = (x = "Hello, Mars!"; return x)
bar (generic function with 1 method)
julia> foo();
julia> bar()
"Hello, Mars!"
julia> function plot(x, y; style="solid", width=1, color="black")
###
end
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> [1; 3;; 2; 4;;; 10*A]
2×2×2 Array{Int64, 3}:
[:, :, 1] =
1 2
3 4
[:, :, 2] =
10 20
30 40
julia> [2; 3;;;]
2×1×1 Array{Int64, 3}:
[:, :, 1] =
2
3
julia> nt = (; x=1) # بدون الـ ; أو فاصلة متبقية، سيؤدي هذا إلى تعيين x
(x = 1,)
julia> key = :a; c = 3;
julia> nt2 = (; key => 1, b=2, c, nt.x)
(a = 1, b = 2, c = 3, x = 1)
julia> (; b, x) = nt2; # تعيين المتغيرات b و x باستخدام تفكيك الخصائص
julia> b, x
(2, 1)
julia> ; # عند كتابة ;، يتغير الموجه (في المكان) إلى: shell>
shell> echo hello
hello
=
— Keyword=
=
هو عامل التعيين.
- بالنسبة للمتغير
a
والتعبيرb
، فإنa = b
يجعلa
تشير إلى قيمةb
. - بالنسبة للدوال
f(x)
، فإنf(x) = x
يحدد دالة جديدة ثابتةf
، أو يضيف طريقة جديدة إلىf
إذا كانتf
معرفة بالفعل؛ هذا الاستخدام يعادلfunction f(x); x; end
. a[i] = v
يستدعيsetindex!
(a,v,i)
.a.b = c
يستدعيsetproperty!
(a,:b,c)
.- داخل استدعاء دالة،
f(a=b)
يمررb
كقيمة للوسيط المسمىa
. - داخل الأقواس مع الفواصل،
(a=1,)
ينشئNamedTuple
.
أمثلة
تعيين a
إلى b
لا ينشئ نسخة من b
؛ بدلاً من ذلك استخدم copy
أو deepcopy
.
julia> b = [1]; a = b; b[1] = 2; a
1-element Array{Int64, 1}:
2
julia> b = [1]; a = copy(b); b[1] = 2; a
1-element Array{Int64, 1}:
1
المجموعات المرسلة إلى الدوال لا تُنسخ أيضًا. يمكن للدوال تعديل (تغيير) محتويات الكائنات التي تشير إليها وسائطها. (أسماء الدوال التي تفعل ذلك تُضاف إليها عادةً علامة '!' في النهاية.)
julia> function f!(x); x[:] .+= 1; end
f! (generic function with 1 method)
julia> a = [1]; f!(a); a
1-element Array{Int64, 1}:
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 Array{Int64, 1}:
3
julia> b[1] = 2; a, b, c
([2], [2], [2])
التعيين في مؤشرات خارج الحدود لا ينمو مجموعة. إذا كانت المجموعة Vector
يمكن أن تنمو بدلاً من ذلك باستخدام push!
أو append!
.
julia> a = [1, 1]; a[3] = 2
ERROR: BoundsError: attempt to access 2-element Array{Int64, 1} at index [3]
[...]
julia> push!(a, 2, 3)
4-element Array{Int64, 1}:
1
1
2
3
تعيين []
لا يلغي العناصر من مجموعة؛ بدلاً من ذلك استخدم filter!
.
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 Array{Int64, 1}:
2
3
?:
— Keyworda ? b : c
صيغة مختصرة للشرطيات؛ اقرأ "إذا كان a
، قم بتقييم b
وإلا قم بتقييم c
". يُعرف أيضًا باسم المشغل الثلاثي.
هذه الصيغة تعادل if a; b else c end
، ولكن غالبًا ما تُستخدم لتسليط الضوء على القيمة 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"
Standard Modules
Main
— ModuleMain
Main
هو الوحدة العليا، ويبدأ جوليا مع تعيين Main
كالوحدة الحالية. المتغيرات المعرفة عند الموجه تذهب في Main
، و varinfo
يسرد المتغيرات في Main
.
julia> @__MODULE__
Main
Core
— Moduleالنواة
النواة
هو الوحدة التي تحتوي على جميع المعرفات التي تعتبر "مضمنة" في اللغة، أي جزء من اللغة الأساسية وليست مكتبات. كل وحدة تحدد ضمنيًا using Core
، حيث لا يمكنك القيام بأي شيء بدون تلك التعريفات.
Base
— ModuleBase
مكتبة الأساس في جوليا. Base
هو وحدة تحتوي على الوظائف الأساسية (محتويات base/
). جميع الوحدات تحتوي ضمنيًا على using Base
، حيث أن هذا مطلوب في الغالبية العظمى من الحالات.
Base Submodules
Base.Broadcast
— ModuleBase.Broadcast
وحدة تحتوي على تنفيذ البث.
Base.Docs
— Moduleالمستندات
يوفر نموذج Docs
ماكرو @doc
الذي يمكن استخدامه لتعيين واسترجاع بيانات التعريف الوثائقية لكائنات جوليا.
يرجى الاطلاع على قسم الدليل حول التوثيق لمزيد من المعلومات.
Base.Iterators
— Moduleطرق العمل مع المكررات.
Base.Libc
— Moduleواجهة لـ libc، مكتبة C القياسية.
Base.Meta
— Moduleوظائف ملائمة للبرمجة الميتا.
Base.StackTraces
— Moduleأدوات لجمع ومعالجة تتبع المكدس. تُستخدم بشكل أساسي لبناء الأخطاء.
Base.Sys
— Moduleقدم طرقًا لاسترجاع المعلومات حول الأجهزة ونظام التشغيل.
Base.Threads
— Moduleدعم تعدد الخيوط.
Base.GC
— ModuleBase.GC
وحدة تحتوي على أدوات جمع القمامة.
All Objects
Core.:===
— Function===(x,y) -> Bool
≡(x,y) -> Bool
حدد ما إذا كان x
و y
متطابقين، بمعنى أنه لا يمكن لأي برنامج تمييزهما. أولاً، تتم مقارنة أنواع x
و y
. إذا كانت تلك متطابقة، تتم مقارنة الكائنات القابلة للتغيير حسب العنوان في الذاكرة، بينما تتم مقارنة الكائنات غير القابلة للتغيير (مثل الأرقام) حسب المحتويات على مستوى البت. تُسمى هذه الدالة أحيانًا "egal". إنها دائمًا تعيد قيمة Bool
.
أمثلة
julia> a = [1, 2]; b = [1, 2];
julia> a == b
true
julia> a === b
false
julia> a === a
true
Core.isa
— Functionisa(x, type) -> Bool
حدد ما إذا كان x
من النوع المعطى type
. يمكن أيضًا استخدامه كعامل بيني، على سبيل المثال x isa type
.
أمثلة
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
Base.isequal
— Functionisequal(x, y) -> Bool
مماثل لـ ==
، باستثناء معالجة أرقام النقطة العائمة والقيم المفقودة. تعالج isequal
جميع قيم NaN
العائمة على أنها متساوية مع بعضها البعض، وتعامل -0.0
على أنها غير متساوية مع 0.0
، وmissing
على أنها متساوية مع missing
. تعيد دائمًا قيمة Bool
.
isequal
هي علاقة تساوي - فهي انعكاسية (===
تعني isequal
)، متناظرة (isequal(a, b)
تعني isequal(b, a)
) وانتقالية (isequal(a, b)
و isequal(b, c)
تعني isequal(a, c)
).
التنفيذ
تقوم التنفيذ الافتراضي لـ isequal
باستدعاء ==
، لذا فإن النوع الذي لا يتضمن قيم النقطة العائمة يحتاج عمومًا فقط إلى تعريف ==
.
تعتبر isequal
دالة المقارنة المستخدمة في جداول التجزئة (Dict
). يجب أن تعني isequal(x,y)
أن hash(x) == hash(y)
.
هذا يعني عادةً أن الأنواع التي توجد لها طريقة مخصصة لـ ==
أو isequal
يجب أن تنفذ طريقة hash
المقابلة (والعكس صحيح). عادةً ما تنفذ المجموعات isequal
عن طريق استدعاء isequal
بشكل متكرر على جميع المحتويات.
علاوة على ذلك، ترتبط isequal
بـ isless
، ويعملان معًا لتعريف ترتيب ثابت كلي، حيث يجب أن يكون واحد فقط من isequal(x, y)
، isless(x, y)
، أو isless(y, x)
هو true
(والاثنان الآخران false
).
عادةً لا تحتاج الأنواع العددية إلى تنفيذ isequal
بشكل منفصل عن ==
، ما لم تمثل أرقام النقطة العائمة القابلة لتنفيذ أكثر كفاءة من تلك المقدمة كخيار عام (استنادًا إلى isnan
، signbit
، و ==
).
أمثلة
julia> isequal([1., NaN], [1., NaN])
true
julia> [1., NaN] == [1., NaN]
false
julia> 0.0 == -0.0
true
julia> isequal(0.0, -0.0)
false
julia> missing == missing
missing
julia> isequal(missing, missing)
true
isequal(x)
أنشئ دالة تقارن وسيطها بـ x
باستخدام isequal
، أي دالة تعادل y -> isequal(y, x)
.
الدالة المعادة من نوع Base.Fix2{typeof(isequal)}
، والتي يمكن استخدامها لتنفيذ طرق متخصصة.
Base.isless
— Functionisless(x, y)
اختبر ما إذا كان x
أقل من y
، وفقًا لترتيب إجمالي ثابت (محدد مع isequal
). isless
غير معرف للأزواج (x, y)
من جميع الأنواع. ومع ذلك، إذا تم تعريفه، فمن المتوقع أن يفي بما يلي:
- إذا كان
isless(x, y)
معرفًا، فإنisless(y, x)
وisequal(x, y)
معرفتان أيضًا، وواحد فقط من تلك الثلاثة يعطيtrue
. - العلاقة التي يحددها
isless
هي علاقة انتقالية، أي أنisless(x, y) && isless(y, z)
تعنيisless(x, z)
.
القيم التي عادة ما تكون غير مرتبة، مثل NaN
، مرتبة بعد القيم العادية. القيم missing
مرتبة أخيرًا.
هذا هو المقارنة الافتراضية المستخدمة بواسطة sort!
.
التنفيذ
يجب على الأنواع غير العددية التي تحتوي على ترتيب إجمالي تنفيذ هذه الوظيفة. تحتاج الأنواع العددية إلى تنفيذها فقط إذا كان لديها قيم خاصة مثل NaN
. يجب على الأنواع التي تحتوي على ترتيب جزئي تنفيذ <
. راجع الوثائق حول ترتيبات بديلة لكيفية تعريف طرق ترتيب بديلة يمكن استخدامها في الفرز والوظائف ذات الصلة.
أمثلة
julia> isless(1, 3)
true
julia> isless("Red", "Blue")
false
Base.isunordered
— Functionisunordered(x)
ارجع true
إذا كان x
قيمة لا يمكن ترتيبها وفقًا لـ <
، مثل NaN
أو missing
.
القيم التي تقيم إلى true
مع هذه الدالة قد تكون قابلة للترتيب بالنسبة لترتيبات أخرى مثل isless
.
هذه الدالة تتطلب Julia 1.7 أو أحدث.
Base.ifelse
— Functionifelse(condition::Bool, x, y)
ارجع x
إذا كانت condition
true
، وإلا ارجع y
. هذا يختلف عن ?
أو if
في أنه دالة عادية، لذا يتم تقييم جميع المعاملات أولاً. في بعض الحالات، يمكن أن يؤدي استخدام ifelse
بدلاً من عبارة if
إلى القضاء على الفرع في الشيفرة المولدة وتوفير أداء أعلى في الحلقات الضيقة.
أمثلة
julia> ifelse(1 > 2, 1, 2)
2
Core.typeassert
— Functiontypeassert(x, type)
ارمي TypeError
ما لم يكن x isa type
. الصيغة x::type
تستدعي هذه الدالة.
أمثلة
julia> typeassert(2.5, Int)
ERROR: TypeError: in typeassert, expected Int64, got a value of type Float64
Stacktrace:
[...]
Core.typeof
— Functiontypeof(x)
احصل على النوع المحدد لـ x
.
انظر أيضًا 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})
Core.tuple
— Functiontuple(xs...)
قم بإنشاء مجموعة من الكائنات المعطاة.
انظر أيضًا Tuple
, ntuple
, NamedTuple
.
أمثلة
julia> tuple(1, 'b', pi)
(1, 'b', π)
julia> ans === (1, 'b', π)
true
julia> Tuple(Real[1, 2, pi]) # يأخذ مجموعة
(1, 2, π)
Base.ntuple
— Functionntuple(f, n::Integer)
أنشئ مجموعة بطول n
، مع حساب كل عنصر كـ f(i)
، حيث i
هو فهرس العنصر.
أمثلة
julia> ntuple(i -> 2*i, 4)
(2, 4, 6, 8)
ntuple(f, ::Val{N})
أنشئ مجموعة بطول N
، حيث يتم حساب كل عنصر كـ f(i)
، حيث i
هو فهرس العنصر. من خلال أخذ وسيط Val(N)
، من الممكن أن تقوم هذه النسخة من ntuple بتوليد كود أكثر كفاءة من النسخة التي تأخذ الطول كعدد صحيح. ولكن ntuple(f, N)
تفضل على ntuple(f, Val(N))
في الحالات التي لا يمكن فيها تحديد N
في وقت الترجمة.
أمثلة
julia> ntuple(i -> 2*i, Val(4))
(2, 4, 6, 8)
Base.objectid
— Functionobjectid(x) -> UInt
احصل على قيمة تجزئة لـ x
بناءً على هوية الكائن.
إذا كان x === y
فإن objectid(x) == objectid(y)
، وعادةً عندما x !== y
، فإن objectid(x) != objectid(y)
.
Base.hash
— Functionhash(x[, h::UInt]) -> UInt
احسب رمز هاش صحيح بحيث isequal(x,y)
تعني hash(x)==hash(y)
. الحجة الثانية الاختيارية h
هي رمز هاش آخر ليتم مزجه مع النتيجة.
يجب على الأنواع الجديدة تنفيذ الشكل ذو الحجتين، عادةً عن طريق استدعاء طريقة hash
ذات الحجتين بشكل متكرر من أجل مزج هاشات المحتويات مع بعضها البعض (ومع h
). عادةً، يجب على أي نوع ينفذ hash
أيضًا تنفيذ ==
الخاصة به (ومن ثم isequal
) لضمان الخاصية المذكورة أعلاه.
قد تتغير قيمة الهاش عند بدء عملية جوليا جديدة.
julia> a = hash(10)
0x95ea2955abd45275
julia> hash(10, a) # استخدم فقط ناتج دالة هاش أخرى كالحجة الثانية
0xd42bad54a8575b16
Base.finalizer
— Functionfinalizer(f, x)
قم بتسجيل دالة f(x)
ليتم استدعاؤها عندما لا توجد مراجع قابلة للوصول من البرنامج إلى x
، وأعد x
. يجب أن يكون نوع x
هو mutable struct
، وإلا ستقوم الدالة بإلقاء استثناء.
يجب ألا تتسبب f
في تبديل المهام، مما يستبعد معظم عمليات الإدخال/الإخراج مثل println
. قد يكون استخدام الماكرو @async
(لتأجيل تبديل السياق إلى خارج المنهي) أو ccall
لاستدعاء دوال الإدخال/الإخراج في C مباشرة مفيدًا لأغراض التصحيح.
لاحظ أنه لا يوجد عمر عالمي مضمون لتنفيذ f
. قد يتم استدعاؤها في العمر العالمي الذي تم فيه تسجيل المنهي أو أي عمر عالمي لاحق.
أمثلة
finalizer(my_mutable_struct) do x
@async println("Finalizing $x.")
end
finalizer(my_mutable_struct) do x
ccall(:jl_safe_printf, Cvoid, (Cstring, Cstring), "Finalizing %s.", repr(x))
end
يمكن تسجيل منهي عند إنشاء الكائن. في المثال التالي، لاحظ أننا نعتمد ضمنيًا على المنهي لإرجاع الهيكل القابل للتغيير x
الذي تم إنشاؤه حديثًا.
mutable struct MyMutableStruct
bar
function MyMutableStruct(bar)
x = new(bar)
f(t) = @async println("Finalizing $t.")
finalizer(f, x)
end
end
Base.finalize
— Functionfinalize(x)
قم بتشغيل المنهيات المسجلة للكائن x
على الفور.
Base.copy
— Functioncopy(x)
إنشاء نسخة ضحلة من x
: يتم نسخ الهيكل الخارجي، ولكن ليس جميع القيم الداخلية. على سبيل المثال، يؤدي نسخ مصفوفة إلى إنتاج مصفوفة جديدة تحتوي على عناصر متطابقة تمامًا مع الأصل.
Base.deepcopy
— Functiondeepcopy(x)
أنشئ نسخة عميقة من x
: يتم نسخ كل شيء بشكل متكرر، مما يؤدي إلى كائن مستقل تمامًا. على سبيل المثال، يؤدي نسخ مصفوفة بشكل عميق إلى إنشاء نسخ عميقة من جميع الكائنات التي تحتوي عليها وينتج مصفوفة جديدة مع هيكل علاقة متسق (على سبيل المثال، إذا كانت العنصران الأولان هما نفس الكائن في المصفوفة الأصلية، فإن العنصرين الأولين من المصفوفة الجديدة سيكونان أيضًا نفس الكائن الذي تم نسخه بشكل عميق). يجب أن يكون استدعاء deepcopy
على كائن ما له نفس التأثير عمومًا مثل تسلسله ثم إعادة تسلسله.
بينما لا يكون ذلك ضروريًا عادةً، يمكن لأنواع المستخدمين المحددة تجاوز سلوك deepcopy
الافتراضي عن طريق تعريف نسخة متخصصة من الدالة deepcopy_internal(x::T, dict::IdDict)
(التي لا ينبغي استخدامها بخلاف ذلك)، حيث T
هو النوع الذي سيتم تخصيصه، و dict
يتتبع الكائنات التي تم نسخها حتى الآن ضمن الاستدعاء المتكرر. ضمن التعريف، يجب استخدام deepcopy_internal
بدلاً من deepcopy
، ويجب تحديث متغير dict
حسب الاقتضاء قبل الإرجاع.
Base.getproperty
— Functiongetproperty(value, name::Symbol)
getproperty(value, name::Symbol, order::Symbol)
الصيغة a.b
تستدعي getproperty(a, :b)
. الصيغة @atomic order a.b
تستدعي getproperty(a, :b, :order)
والصيغة @atomic 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
يجب على المرء أن يقوم بتحميل getproperty
فقط عند الضرورة، حيث يمكن أن يكون سلوك الصيغة obj.f
محيرًا إذا كان غير عادي. كما يجب ملاحظة أن استخدام الطرق غالبًا ما يكون مفضلًا. انظر أيضًا إلى وثائق دليل الأسلوب هذا لمزيد من المعلومات: فضل الطرق المصدرة على الوصول المباشر إلى الحقول.
انظر أيضًا getfield
، propertynames
و setproperty!
.
Base.setproperty!
— Functionsetproperty!(value, name::Symbol, x)
setproperty!(value, name::Symbol, x, order::Symbol)
تستدعي الصيغة a.b = c
الدالة setproperty!(a, :b, c)
. تستدعي الصيغة @atomic order a.b = c
الدالة setproperty!(a, :b, c, :order)
وتستدعي الصيغة @atomic a.b = c
الدالة setproperty!(a, :b, c, :sequentially_consistent)
.
يتطلب استخدام setproperty!
على الوحدات على الأقل Julia 1.8.
انظر أيضًا setfield!
, propertynames
و getproperty
.
Base.replaceproperty!
— Functionreplaceproperty!(x, f::Symbol, expected, desired, success_order::Symbol=:not_atomic, fail_order::Symbol=success_order)
قم بإجراء عملية مقارنة وتبديل على x.f
من expected
إلى desired
، وفقًا لـ egal. يمكن استخدام الصيغة @atomicreplace x.f expected => desired
بدلاً من شكل استدعاء الدالة.
انظر أيضًا replacefield!
setproperty!
, setpropertyonce!
.
Base.swapproperty!
— Functionswapproperty!(x, f::Symbol, v, order::Symbol=:not_atomic)
الصيغة @atomic a.b, _ = c, a.b
تعيد (c, swapproperty!(a, :b, c, :sequentially_consistent))
، حيث يجب أن يكون هناك تعبير getproperty
مشترك بين الجانبين.
انظر أيضًا swapfield!
و setproperty!
.
Base.modifyproperty!
— Functionmodifyproperty!(x, f::Symbol, op, v, order::Symbol=:not_atomic)
تقوم الصيغة @atomic op(x.f, v)
(ومكافئها @atomic x.f op v
) بإرجاع modifyproperty!(x, :f, op, v, :sequentially_consistent)
, حيث يجب أن تكون الحجة الأولى تعبير getproperty
ويتم تعديلها بشكل ذري.
يجب أن تعيد استدعاء op(getproperty(x, f), v)
قيمة يمكن تخزينها في الحقل f
من الكائن x
بشكل افتراضي. على وجه الخصوص، على عكس السلوك الافتراضي لـ setproperty!
, لا يتم استدعاء دالة convert
تلقائيًا.
انظر أيضًا modifyfield!
و setproperty!
.
Base.setpropertyonce!
— Functionsetpropertyonce!(x, f::Symbol, value, success_order::Symbol=:not_atomic, fail_order::Symbol=success_order)
قم بإجراء عملية مقارنة وتبديل على x.f
لتعيينها إلى value
إذا كانت غير محددة مسبقًا. يمكن استخدام الصيغة @atomiconce x.f = value
بدلاً من شكل استدعاء الدالة.
انظر أيضًا setfieldonce!
, setproperty!
, replaceproperty!
.
تتطلب هذه الدالة Julia 1.11 أو أحدث.
Base.propertynames
— Functionpropertynames(x, private=false)
احصل على مجموعة أو متجه من الخصائص (x.property
) لكائن x
. عادةً ما يكون هذا هو نفسه كما في fieldnames(typeof(x))
، ولكن الأنواع التي تعيد تعريف getproperty
يجب عمومًا أن تعيد تعريف propertynames
أيضًا للحصول على خصائص مثيل من النوع.
قد تُرجع propertynames(x)
أسماء الخصائص "العامة" فقط التي هي جزء من واجهة x
الموثقة. إذا كنت تريد أيضًا أن تُرجع أسماء الخصائص "الخاصة" المخصصة للاستخدام الداخلي، مرر true
كوسيط ثانٍ اختياري. يُظهر إكمال علامة التبويب في REPL على x.
فقط الخصائص private=false
.
انظر أيضًا: hasproperty
، hasfield
.
Base.hasproperty
— Functionhasproperty(x, s::Symbol)
إرجاع قيمة منطقية تشير إلى ما إذا كان الكائن x
لديه s
كواحدة من خصائصه الخاصة.
تتطلب هذه الدالة على الأقل جوليا 1.2.
انظر أيضًا: propertynames
, hasfield
.
Core.getfield
— Functiongetfield(value, name::Symbol, [order::Symbol])
getfield(value, i::Int, [order::Symbol])
استخرج حقلًا من value
المركب بواسطة الاسم أو الموضع. يمكن تحديد ترتيب للعملية بشكل اختياري. إذا تم إعلان الحقل كـ @atomic
، يُوصى بشدة أن يكون التحديد متوافقًا مع التخزين في ذلك الموقع. خلاف ذلك، إذا لم يتم إعلانه كـ @atomic
، يجب أن تكون هذه المعلمة :not_atomic
إذا تم تحديدها. انظر أيضًا getproperty
و fieldnames
.
أمثلة
julia> a = 1//2
1//2
julia> getfield(a, :num)
1
julia> a.num
1
julia> getfield(a, 1)
1
Core.setfield!
— Functionsetfield!(value, name::Symbol, x, [order::Symbol])
setfield!(value, i::Int, x, [order::Symbol])
قم بتعيين x
إلى حقل مسمى في value
من نوع مركب. يجب أن يكون value
قابلاً للتغيير ويجب أن يكون x
من نوع فرعي لـ fieldtype(typeof(value), name)
. بالإضافة إلى ذلك، يمكن تحديد ترتيب لهذه العملية. إذا تم إعلان الحقل كـ @atomic
، فإن هذا التحديد إلزامي. خلاف ذلك، إذا لم يتم إعلانه كـ @atomic
، يجب أن يكون :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
Core.modifyfield!
— Functionmodifyfield!(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
إذا كان مدعومًا من قبل الأجهزة (على سبيل المثال، الزيادة الذرية)، فقد يتم تحسين ذلك إلى تعليمات الأجهزة المناسبة، وإلا فسيستخدم حلقة.
تتطلب هذه الدالة Julia 1.7 أو أحدث.
Core.replacefield!
— Functionreplacefield!(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)
إذا كان مدعومًا من قبل الأجهزة، فقد يتم تحسين ذلك إلى تعليمات الأجهزة المناسبة، وإلا فسيستخدم حلقة.
تتطلب هذه الدالة Julia 1.7 أو أحدث.
Core.swapfield!
— Functionswapfield!(value, name::Symbol, x, [order::Symbol])
swapfield!(value, i::Int, x, [order::Symbol])
قم بتنفيذ العمليات بشكل ذري للحصول على وتعيين حقل في نفس الوقت:
y = getfield(value, name)
setfield!(value, name, x)
return y
تتطلب هذه الدالة Julia 1.7 أو أحدث.
Core.setfieldonce!
— Functionsetfieldonce!(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
تتطلب هذه الدالة Julia 1.11 أو أحدث.
Core.isdefined
— Functionisdefined(m::Module, s::Symbol, [order::Symbol])
isdefined(object, s::Symbol, [order::Symbol])
isdefined(object, index::Int, [order::Symbol])
يختبر ما إذا كانت متغير عالمي أو حقل كائن محدد. يمكن أن تكون المعاملات وحدة ورمز أو كائن مركب واسم حقل (كرمز) أو فهرس. يمكن تحديد ترتيب للعملية بشكل اختياري. إذا تم إعلان الحقل @atomic
، يُوصى بشدة بأن تكون المواصفة متوافقة مع التخزين في ذلك الموقع. خلاف ذلك، إذا لم يتم إعلانه كـ @atomic
، يجب أن تكون هذه المعلمة :not_atomic
إذا تم تحديدها.
لاختبار ما إذا كان عنصر مصفوفة محددًا، استخدم isassigned
بدلاً من ذلك.
انظر أيضًا @isdefined
.
أمثلة
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
Base.@isdefined
— Macro@isdefined s -> Bool
يختبر ما إذا كانت المتغير s
معرفًا في النطاق الحالي.
انظر أيضًا isdefined
لخصائص الحقول وisassigned
لفهارس المصفوفات أو haskey
للت mappings الأخرى.
أمثلة
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
Base.convert
— Functionconvert(T, x)
قم بتحويل x
إلى قيمة من النوع T
.
إذا كان T
من نوع Integer
، سيتم رفع InexactError
إذا لم يكن x
قابلاً للتمثيل بواسطة T
، على سبيل المثال إذا لم يكن x
ذو قيمة صحيحة، أو كان خارج النطاق المدعوم بواسطة T
.
أمثلة
julia> convert(Int, 3.0)
3
julia> convert(Int, 3.5)
ERROR: InexactError: Int64(3.5)
Stacktrace:
[...]
إذا كان T
من نوع AbstractFloat
، فسيعيد أقرب قيمة إلى x
قابلة للتمثيل بواسطة T
. يتم اعتبار Inf كواحد ulp أكبر من floatmax(T)
لأغراض تحديد الأقرب.
julia> x = 1/3
0.3333333333333333
julia> convert(Float32, x)
0.33333334f0
julia> convert(BigFloat, x)
0.333333333333333314829616256247390992939472198486328125
إذا كان T
من نوع مجموعة و x
مجموعة، قد يكون ناتج convert(T, x)
متطابقًا مع كل أو جزء من x
.
julia> x = Int[1, 2, 3];
julia> y = convert(Vector{Int}, x);
julia> y === x
true
انظر أيضًا: round
، trunc
، oftype
، reinterpret
. ```
Base.promote
— Functionpromote(xs...)
قم بتحويل جميع المعاملات إلى نوع مشترك، وأعدها جميعًا (كـ tuple). إذا لم يكن بالإمكان تحويل أي معاملات، يتم رفع خطأ.
انظر أيضًا: promote_type
، promote_rule
.
أمثلة
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
Base.oftype
— Functionoftype(x, y)
قم بتحويل y
إلى نوع x
أي convert(typeof(x), y)
.
أمثلة
julia> x = 4;
julia> y = 3.;
julia> oftype(x, y)
3
julia> oftype(y, x)
4.0
Base.widen
— Functionwiden(x)
إذا كانت x
نوعًا، فإنها تعيد نوعًا "أكبر"، يتم تعريفه بحيث تضمن العمليات الحسابية +
و -
عدم حدوث تجاوز أو فقدان الدقة لأي مجموعة من القيم التي يمكن أن يحملها النوع x
.
بالنسبة لأنواع الأعداد الصحيحة ذات الحجم الثابت التي تقل عن 128 بت، ستعيد widen
نوعًا يحتوي على ضعف عدد البتات.
إذا كانت x
قيمة، يتم تحويلها إلى widen(typeof(x))
.
أمثلة
julia> widen(Int32)
Int64
julia> widen(1.5f0)
1.5
Base.identity
— Functionidentity(x)
دالة الهوية. تعيد وسيطها.
انظر أيضًا: one
، oneunit
، و I
من LinearAlgebra
.
أمثلة
julia> identity("Well, what did you expect?")
"Well, what did you expect?"
Core.WeakRef
— TypeWeakRef(x)
w = WeakRef(x)
ينشئ مرجع ضعيف للقيمة جوليا x
: على الرغم من أن w
يحتوي على مرجع لـ x
، إلا أنه لا يمنع x
من أن يتم جمعه بواسطة جامع القمامة. w.value
إما أن تكون x
(إذا لم يتم جمع x
بواسطة جامع القمامة بعد) أو nothing
(إذا تم جمع x
بواسطة جامع القمامة).
julia> x = "a string"
"a string"
julia> w = WeakRef(x)
WeakRef("a string")
julia> GC.gc()
julia> w # يتم الحفاظ على المرجع عبر `x`
WeakRef("a string")
julia> x = nothing # مسح المرجع
julia> GC.gc()
julia> w
WeakRef(nothing)
Properties of Types
Type relations
Base.supertype
— Functionsupertype(T::DataType)
إرجاع السوبرتايب لنوع البيانات T
.
أمثلة
julia> supertype(Int32)
Signed
Core.Type
— TypeCore.Type{T}
Core.Type
هو نوع مجرد يحتوي على جميع كائنات النوع كحالات له. الحالة الوحيدة لنوع الوحدة Core.Type{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
Core.DataType
— TypeDataType <: Type{T}
DataType
يمثل الأنواع المعلنة صراحةً التي لها أسماء، والأنواع العليا المعلنة صراحةً، و، اختيارياً، المعلمات. كل قيمة ملموسة في النظام هي مثيل من نوع DataType
.
أمثلة
julia> typeof(Real)
DataType
julia> typeof(Int)
DataType
julia> struct Point
x::Int
y
end
julia> typeof(Point)
DataType
Core.:<:
— Function<:(T1, T2)
عامل النوع الفرعي: يُرجع true
إذا وفقط إذا كانت جميع قيم النوع T1
هي أيضًا من النوع T2
.
أمثلة
julia> Float64 <: AbstractFloat
true
julia> Vector{Int} <: AbstractArray
true
julia> Matrix{Float64} <: Matrix{AbstractFloat}
false
Base.:>:
— Function>:(T1, T2)
عامل السوبرتايب، يعادل T2 <: T1
.
Base.typejoin
— Functiontypejoin(T, S, ...)
إرجاع أقرب سلف مشترك للأنواع T
و S
، أي أضيق نوع يرثان منه كلاهما. يتكرر على المتغيرات الإضافية.
أمثلة
julia> typejoin(Int, Float64)
Real
julia> typejoin(Int, Float64, ComplexF32)
Number
Base.typeintersect
— Functiontypeintersect(T::Type, S::Type)
احسب نوعًا يحتوي على تقاطع T
و S
. عادةً ما سيكون هذا هو أصغر نوع من هذا القبيل أو نوع قريب منه.
حالة خاصة حيث يتم ضمان السلوك الدقيق: عندما يكون T <: S
، فإن typeintersect(S, T) == T == typeintersect(T, S)
.
Base.promote_type
— Functionpromote_type(type1, type2, ...)
تشير الترقية إلى تحويل قيم الأنواع المختلطة إلى نوع مشترك واحد. تمثل promote_type
سلوك الترقية الافتراضي في جوليا عندما يتم إعطاء المشغلين (عادةً رياضيين) معاملات من أنواع مختلفة. تحاول promote_type
عمومًا إرجاع نوع يمكنه على الأقل تقريب معظم قيم أي من نوع الإدخال دون توسيع مفرط. يتم التسامح مع بعض الفقد؛ على سبيل المثال، تعيد promote_type(Int64, Float64)
Float64
على الرغم من أنه بشكل صارم، لا يمكن تمثيل جميع قيم Int64
بدقة كقيم Float64
.
انظر أيضًا: promote
, promote_typejoin
, promote_rule
.
أمثلة
julia> promote_type(Int64, Float64)
Float64
julia> promote_type(Int32, Int64)
Int64
julia> promote_type(Float32, BigInt)
BigFloat
julia> promote_type(Int16, Float16)
Float16
julia> promote_type(Int64, Float16)
Float16
julia> promote_type(Int8, UInt16)
UInt16
!!! تحذير "لا تقم بتحميل هذا مباشرة" لتحميل الترقية لأنواعك الخاصة، يجب عليك تحميل promote_rule
. تستدعي promote_type
promote_rule
داخليًا لتحديد النوع. يمكن أن يؤدي تحميل promote_type
مباشرة إلى حدوث أخطاء غموض. ```
Base.promote_rule
— Functionpromote_rule(type1, type2)
يحدد نوع البيانات الذي يجب استخدامه بواسطة promote
عند إعطائه قيم من النوعين type1
و type2
. لا ينبغي استدعاء هذه الدالة مباشرة، ولكن يجب إضافة تعريفات لها لأنواع جديدة حسب الاقتضاء.
Base.promote_typejoin
— Functionpromote_typejoin(T, S)
احسب نوعًا يحتوي على كل من T
و S
، والذي يمكن أن يكون إما والدًا لكلا النوعين، أو Union
إذا كان ذلك مناسبًا. يتراجع إلى typejoin
.
انظر أيضًا promote
، promote_type
.
أمثلة
julia> Base.promote_typejoin(Int, Float64)
Real
julia> Base.promote_type(Int, Float64)
Float64
Base.isdispatchtuple
— Functionisdispatchtuple(T)
حدد ما إذا كان النوع T
هو نوع "ورقة" من التوابل، مما يعني أنه يمكن أن يظهر كنوع في التوزيع وليس له أنواع فرعية (أو أنواع عليا) يمكن أن تظهر في استدعاء. إذا لم يكن T
نوعًا، فقم بإرجاع false
.
Declared structure
Base.ismutable
— Functionismutable(v) -> Bool
ارجع true
إذا وفقط إذا كانت القيمة v
قابلة للتغيير. انظر Mutable Composite Types لمناقشة عدم القابلية للتغيير. لاحظ أن هذه الدالة تعمل على القيم، لذا إذا أعطيتها DataType
، ستخبرك أن قيمة من هذا النوع قابلة للتغيير.
!!! ملاحظة لأسباب تقنية، ترجع ismutable
true
لقيم من أنواع خاصة معينة (على سبيل المثال String
و Symbol
) على الرغم من أنه لا يمكن تغييرها بطريقة مسموح بها.
انظر أيضًا isbits
، isstructtype
.
أمثلة
julia> ismutable(1)
false
julia> ismutable([1,2])
true
!!! توافق "جوليا 1.5" تتطلب هذه الدالة على الأقل جوليا 1.5.
Base.isimmutable
— Functionisimmutable(v) -> Bool
اعتبر استخدام !ismutable(v)
بدلاً من ذلك، حيث سيتم استبدال isimmutable(v)
بـ !ismutable(v)
في إصدار مستقبلي. (منذ جوليا 1.5)
ارجع true
إذا كانت القيمة v
غير قابلة للتغيير. انظر أنواع المركبات القابلة للتغيير لمناقشة عدم القابلية للتغيير. لاحظ أن هذه الدالة تعمل على القيم، لذا إذا أعطيتها نوعًا، ستخبرك أن قيمة DataType
قابلة للتغيير.
أمثلة
julia> isimmutable(1)
true
julia> isimmutable([1,2])
false
Base.ismutabletype
— Functionismutabletype(T) -> Bool
حدد ما إذا كان النوع T
قد تم إعلانه كنوع قابل للتغيير (أي باستخدام الكلمة الرئيسية mutable struct
). إذا لم يكن T
نوعًا، فقم بإرجاع false
.
تتطلب هذه الوظيفة على الأقل جوليا 1.7.
Base.isabstracttype
— Functionisabstracttype(T)
حدد ما إذا كان النوع T
قد تم إعلانه كنوع مجرد (أي باستخدام بناء جملة abstract type
). لاحظ أن هذا ليس نفيًا لـ isconcretetype(T)
. إذا لم يكن T
نوعًا، فقم بإرجاع false
.
أمثلة
julia> isabstracttype(AbstractArray)
true
julia> isabstracttype(Vector)
false
Base.isprimitivetype
— Functionisprimitivetype(T) -> Bool
حدد ما إذا كان النوع T
قد تم إعلانه كنوع بدائي (أي باستخدام بناء جملة primitive type
). إذا لم يكن T
نوعًا، فقم بإرجاع false
.
Base.issingletontype
— FunctionBase.issingletontype(T)
حدد ما إذا كان النوع T
لديه بالضبط مثيل واحد ممكن؛ على سبيل المثال، نوع هيكل بدون حقول باستثناء قيم مفردة أخرى. إذا لم يكن T
نوعًا ملموسًا، فقم بإرجاع false
.
Base.isstructtype
— Functionisstructtype(T) -> Bool
حدد ما إذا كان النوع T
قد تم إعلانه كنوع هيكل (أي باستخدام الكلمة الرئيسية struct
أو mutable struct
). إذا لم يكن T
نوعًا، فقم بإرجاع false
.
Base.nameof
— Methodnameof(t::DataType) -> Symbol
احصل على اسم نوع البيانات (الذي قد يكون مغلفًا بـ UnionAll
) كرمز، بدون وحدة الوالد.
أمثلة
julia> module Foo
struct S{T}
end
end
Foo
julia> nameof(Foo.S{T} where T)
:S
Base.fieldnames
— Functionfieldnames(x::DataType)
احصل على مجموعة تحتوي على أسماء حقول DataType
.
انظر أيضًا propertynames
، hasfield
.
أمثلة
julia> fieldnames(Rational)
(:num, :den)
julia> fieldnames(typeof(1+im))
(:re, :im)
Base.fieldname
— Functionfieldname(x::DataType, i::Integer)
احصل على اسم الحقل i
من DataType
.
أمثلة
julia> fieldname(Rational, 1)
:num
julia> fieldname(Rational, 2)
:den
Core.fieldtype
— Functionfieldtype(T, name::Symbol | index::Int)
حدد نوع الحقل المعلن (المحدد بالاسم أو الفهرس) في نوع البيانات المركب T
.
أمثلة
julia> struct Foo
x::Int64
y::String
end
julia> fieldtype(Foo, :x)
Int64
julia> fieldtype(Foo, 2)
String
Base.fieldtypes
— Functionfieldtypes(T::Type)
أنواع الحقول المعلنة لجميع الحقول في نوع البيانات المركب T
كـ tuple.
تتطلب هذه الدالة على الأقل Julia 1.1.
أمثلة
julia> struct Foo
x::Int64
y::String
end
julia> fieldtypes(Foo)
(Int64, String)
Base.fieldcount
— Functionfieldcount(t::Type)
احصل على عدد الحقول التي سيكون لدى مثيل من النوع المعطى. يتم طرح خطأ إذا كان النوع مجردًا جدًا لتحديد ذلك.
Base.hasfield
— Functionhasfield(T::Type, name::Symbol)
إرجاع قيمة منطقية تشير إلى ما إذا كان T
يحتوي على name
كأحد حقوله الخاصة.
انظر أيضًا fieldnames
، fieldcount
، hasproperty
.
تتطلب هذه الدالة على الأقل Julia 1.2.
أمثلة
julia> struct Foo
bar::Int
end
julia> hasfield(Foo, :bar)
true
julia> hasfield(Foo, :x)
false
Core.nfields
— Functionnfields(x) -> Int
احصل على عدد الحقول في الكائن المعطى.
أمثلة
julia> a = 1//2;
julia> nfields(a)
2
julia> b = 1
1
julia> nfields(b)
0
julia> ex = ErrorException("لقد قمت بشيء سيء");
julia> nfields(ex)
1
في هذه الأمثلة، a
هو Rational
، الذي يحتوي على حقلين. b
هو Int
، وهو نوع بدائي من البتات بدون أي حقول على الإطلاق. ex
هو ErrorException
، الذي يحتوي على حقل واحد.
Base.isconst
— Functionisconst(m::Module, s::Symbol) -> Bool
حدد ما إذا كان المتغير العالمي مُعلنًا كـ const
في الوحدة المعطاة m
.
isconst(t::DataType, s::Union{Int,Symbol}) -> Bool
حدد ما إذا كان الحقل s
مُعلنًا عنه كـ const
في نوع معين t
.
Base.isfieldatomic
— Functionisfieldatomic(t::DataType, s::Union{Int,Symbol}) -> Bool
حدد ما إذا كان الحقل s
مُعلنًا عنه كـ @atomic
في نوع معين t
.
Memory layout
Base.sizeof
— Methodsizeof(T::DataType)
sizeof(obj)
الحجم، بالبايت، من التمثيل الثنائي القياسي لنوع البيانات المعطى DataType
T
، إذا كان موجودًا. أو الحجم، بالبايت، من الكائن obj
إذا لم يكن نوع بيانات.
انظر أيضًا Base.summarysize
.
أمثلة
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) # ليس مجموع `sizeof` للحقول بسبب الحشو
16
julia> sizeof(Int64) + sizeof(Bool) # مختلف عن السابق
9
إذا لم يكن لنوع البيانات T
حجم محدد، يتم إلقاء خطأ.
julia> sizeof(AbstractArray)
ERROR: النوع المجرد AbstractArray ليس له حجم محدد.
Stacktrace:
[...]
Base.isconcretetype
— Functionisconcretetype(T)
حدد ما إذا كان النوع T
نوعًا ملموسًا، مما يعني أنه يمكن أن يكون له حالات مباشرة (قيم x
بحيث typeof(x) === T
). لاحظ أن هذا ليس نفيًا لـ isabstracttype(T)
. إذا لم يكن T
نوعًا، فارجع false
.
انظر أيضًا: isbits
, isabstracttype
, issingletontype
.
أمثلة
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
Base.isbits
— Functionisbits(x)
ارجع true
إذا كان x
هو مثيل من نوع isbitstype
.
Base.isbitstype
— Functionisbitstype(T)
ارجع true
إذا كان النوع T
نوع "بيانات عادية"، مما يعني أنه غير قابل للتغيير ولا يحتوي على مراجع لقيم أخرى، فقط أنواع primitive
وأنواع أخرى من isbitstype
. الأمثلة النموذجية هي الأنواع العددية مثل UInt8
، Float64
، و Complex{Float64}
. هذه الفئة من الأنواع مهمة لأنها صالحة كمعلمات نوع، وقد لا تتعقب حالة isdefined
/ isassigned
، ولها تخطيط محدد يتوافق مع C. إذا لم يكن T
نوعًا، فارجع false
.
انظر أيضًا isbits
، isprimitivetype
، ismutable
.
أمثلة
julia> isbitstype(Complex{Float64})
true
julia> isbitstype(Complex)
false
Base.fieldoffset
— Functionfieldoffset(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)
13-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)
Base.datatype_alignment
— FunctionBase.datatype_alignment(dt::DataType) -> Int
الحد الأدنى لمحاذاة تخصيص الذاكرة لعينات من هذا النوع. يمكن استدعاؤه على أي isconcretetype
، على الرغم من أنه بالنسبة للذاكرة، سيعطي محاذاة العناصر، وليس الكائن بالكامل.
Base.datatype_haspadding
— FunctionBase.datatype_haspadding(dt::DataType) -> Bool
إرجاع ما إذا كانت حقول مثيلات هذا النوع مضغوطة في الذاكرة، دون وجود بتات حشو متداخلة (تعرف على أنها بتات لا تؤثر قيمتها بشكل فريد على اختبار المساواة عند تطبيقه على حقول الهيكل). يمكن استدعاؤها على أي isconcretetype
.
Base.datatype_pointerfree
— FunctionBase.datatype_pointerfree(dt::DataType) -> Bool
إرجاع ما إذا كانت مثيلات هذا النوع يمكن أن تحتوي على مراجع إلى الذاكرة المدارة بواسطة gc. يمكن استدعاؤه على أي isconcretetype
.
Special values
Base.typemin
— Functiontypemin(T)
أدنى قيمة يمكن تمثيلها بواسطة نوع البيانات الرقمي (الحقيقي) المعطى T
.
انظر أيضًا: floatmin
, typemax
, eps
.
أمثلة
julia> typemin(Int8)
-128
julia> typemin(UInt32)
0x00000000
julia> typemin(Float16)
-Inf16
julia> typemin(Float32)
-Inf32
julia> nextfloat(-Inf32) # أصغر عدد نقطة عائمة من نوع Float32
-3.4028235f38
Base.typemax
— Functiontypemax(T)
أعلى قيمة يمكن تمثيلها بواسطة DataType
(رقم حقيقي) المعطى.
انظر أيضًا: floatmax
, typemin
, eps
.
أمثلة
julia> typemax(Int8)
127
julia> typemax(UInt32)
0xffffffff
julia> typemax(Float64)
Inf
julia> typemax(Float32)
Inf32
julia> floatmax(Float32) # أكبر عدد نقطة عائمة Finite من نوع Float32
3.4028235f38
Base.floatmin
— Functionfloatmin(T = Float64)
إرجاع أصغر عدد عادي موجب يمكن تمثيله بواسطة نوع النقطة العائمة T
.
أمثلة
julia> floatmin(Float16)
Float16(6.104e-5)
julia> floatmin(Float32)
1.1754944f-38
julia> floatmin()
2.2250738585072014e-308
Base.floatmax
— Functionfloatmax(T = Float64)
إرجاع أكبر عدد نهائي يمكن تمثيله بواسطة نوع النقطة العائمة T
.
انظر أيضًا: typemax
، floatmin
، eps
.
أمثلة
julia> floatmax(Float16)
Float16(6.55e4)
julia> floatmax(Float32)
3.4028235f38
julia> floatmax()
1.7976931348623157e308
julia> typemax(Float64)
Inf
Base.maxintfloat
— Functionmaxintfloat(T=Float64)
أكبر عدد عشري متسلسل ذو قيمة صحيحة يتم تمثيله بدقة في نوع النقطة العائمة المعطى T
(الذي يكون افتراضيًا Float64
).
أي أن maxintfloat
يُرجع أصغر عدد عشري ذو قيمة صحيحة موجب n
بحيث أن n+1
ليس قابلًا للتمثيل بدقة في النوع T
.
عند الحاجة إلى قيمة من نوع Integer
، استخدم Integer(maxintfloat(T))
.
maxintfloat(T, S)
أكبر عدد صحيح متتالي يمكن تمثيله في نوع النقطة العائمة المعطى T
والذي لا يتجاوز أيضًا أكبر عدد صحيح يمكن تمثيله بواسطة نوع العدد الصحيح S
. بمعنى آخر، هو الحد الأدنى من maxintfloat(T)
و typemax(S)
.
Base.eps
— Methodeps(::Type{T}) where T<:AbstractFloat
eps()
ارجع آلة إبسيلون لنوع النقطة العائمة T
(T = Float64
بشكل افتراضي). يتم تعريفه على أنه الفجوة بين 1 وأكبر قيمة قابلة للتمثيل التالية بواسطة typeof(one(T))
، وهو ما يعادل eps(one(T))
. (نظرًا لأن eps(T)
هو حد على الخطأ النسبي لـ T
، فهو كمية "بلا أبعاد" مثل one
.)
أمثلة
julia> eps()
2.220446049250313e-16
julia> eps(Float32)
1.1920929f-7
julia> 1.0 + eps()
1.0000000000000002
julia> 1.0 + eps()/2
1.0
Base.eps
— Methodeps(x::AbstractFloat)
ارجع الوحدة في آخر مكان (ulp) لـ x
. هذه هي المسافة بين قيم النقطة العائمة القابلة للتمثيل المتتالية عند x
. في معظم الحالات، إذا كانت المسافة على أي جانب من x
مختلفة، يتم أخذ الأكبر من الاثنين، أي
eps(x) == max(x-prevfloat(x), nextfloat(x)-x)
الاستثناءات من هذه القاعدة هي أصغر وأكبر القيم النهائية (مثل nextfloat(-Inf)
و prevfloat(Inf)
لـ Float64
)، والتي تقرب إلى الأصغر من القيم.
السبب وراء هذا السلوك هو أن eps
يحدد خطأ التقريب في النقطة العائمة. تحت وضع التقريب الافتراضي RoundNearest
، إذا كان $y$ عددًا حقيقيًا و $x$ هو أقرب عدد نقطة عائمة إلى $y$، فإن
\[|y-x| \leq \operatorname{eps}(x)/2.\]
انظر أيضًا: nextfloat
، issubnormal
، floatmax
.
أمثلة
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) # أكبر Float64 نهائي
1.7976931348623157e308
julia> x + eps(x)/2 # يقرب للأعلى
Inf
julia> x + prevfloat(eps(x)/2) # يقرب للأسفل
1.7976931348623157e308
Base.instances
— Functioninstances(T::Type)
إرجاع مجموعة من جميع الحالات لنوع معين، إذا كان ذلك ممكنًا. يُستخدم بشكل أساسي لأنواع التعداد (انظر @enum
).
أمثلة
julia> @enum Color red blue green
julia> instances(Color)
(red, blue, green)
Special Types
Core.Any
— TypeAny::DataType
Any
هو اتحاد جميع الأنواع. لديه الخاصية المحددة isa(x, Any) == true
لأي x
. وبالتالي، يصف Any
الكون بأسره من القيم الممكنة. على سبيل المثال، Integer
هو مجموعة فرعية من Any
تشمل Int
و Int8
وأنواع الأعداد الصحيحة الأخرى.
Core.Union
— TypeUnion{Types...}
نوع Union
هو نوع تجريدي يتضمن جميع حالات أي من أنواع وسائطه. هذا يعني أن T <: Union{T,S}
و S <: Union{T,S}
.
مثل الأنواع التجريدية الأخرى، لا يمكن إنشاء مثيل له، حتى لو كانت جميع وسائطه غير تجريدية.
أمثلة
julia> IntOrString = Union{Int,AbstractString}
Union{Int64, AbstractString}
julia> 1 isa IntOrString # مثيل من Int مدرج في الاتحاد
true
julia> "Hello!" isa IntOrString # String مدرج أيضًا
true
julia> 1.0 isa IntOrString # Float64 غير مدرج لأنه ليس Int ولا AbstractString
false
مساعدة موسعة
على عكس معظم الأنواع المعاملية الأخرى، فإن الاتحادات متوافقة في معلماتها. على سبيل المثال، Union{Real, String}
هو نوع فرعي من Union{Number, AbstractString}
.
الاتحاد الفارغ Union{}
هو النوع الأدنى في جوليا.
Union{}
— KeywordUnion{}
Union{}
، وهو Union
الفارغ من الأنواع، هو النوع الذي ليس له قيم. أي أنه يمتلك الخاصية التعريفية isa(x, Union{}) == false
لأي x
. يتم تعريف Base.Bottom
كاسم مستعار له ونوع Union{}
هو Core.TypeofBottom
.
أمثلة
julia> isa(nothing, Union{})
false
Core.UnionAll
— TypeUnionAll
اتحاد الأنواع على جميع قيم معلمة النوع. يتم استخدام UnionAll
لوصف الأنواع المعاملية حيث لا تُعرف قيم بعض المعلمات. انظر قسم الدليل حول أنواع UnionAll.
أمثلة
julia> typeof(Vector)
UnionAll
julia> typeof(Vector{Int})
DataType
Core.Tuple
— TypeTuple{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).
يمكن بناء التوابل من مكرر باستخدام نوع Tuple
كمنشئ:
julia> Tuple(["a", 1])
("a", 1)
julia> Tuple{String, Float64}(["a", 1])
("a", 1.0)
أنواع التوابل متغايرة في معلماتها: Tuple{Int}
هو نوع فرعي من Tuple{Any}
. لذلك يعتبر Tuple{Any}
نوعًا مجردًا، وأنواع التوابل تكون ملموسة فقط إذا كانت معلماتها ملموسة. لا تحتوي التوابل على أسماء حقول؛ يتم الوصول إلى الحقول فقط بواسطة الفهرس. قد تحتوي أنواع التوابل على أي عدد من المعلمات.
راجع قسم الدليل حول أنواع التوابل.
انظر أيضًا Vararg
، NTuple
، ntuple
، tuple
، NamedTuple
.
Core.NTuple
— TypeNTuple{N, T}
طريقة مدمجة لتمثيل النوع لصف من الطول N
حيث جميع العناصر من النوع T
.
أمثلة
julia> isa((1, 2, 3, 4, 5, 6), NTuple{6, Int})
true
انظر أيضًا ntuple
.
Core.NamedTuple
— TypeNamedTuple
NamedTuple
s هي، كما يوحي اسمها، Tuple
s مسماة. أي أنها مجموعة تشبه التوابل من القيم، حيث يحتوي كل إدخال على اسم فريد، يتم تمثيله كـ Symbol
. مثل Tuple
s، NamedTuple
s غير قابلة للتغيير؛ لا يمكن تعديل الأسماء أو القيم في مكانها بعد الإنشاء.
يمكن إنشاء tuple مسمى كـ literal tuple مع مفاتيح، على سبيل المثال (a=1, b=2)
، أو كـ literal tuple مع فاصلة منقوطة بعد القوس المفتوح، على سبيل المثال (; a=1, b=2)
(هذا الشكل يقبل أيضًا الأسماء التي تم إنشاؤها برمجيًا كما هو موضح أدناه)، أو باستخدام نوع NamedTuple
كمنشئ، على سبيل المثال NamedTuple{(:a, :b)}((1,2))
.
يمكن الوصول إلى القيمة المرتبطة باسم في tuple مسمى باستخدام بناء جملة الوصول إلى الحقول، على سبيل المثال x.a
، أو باستخدام getindex
، على سبيل المثال x[:a]
أو x[(:a, :b)]
. يمكن الحصول على tuple من الأسماء باستخدام keys
، ويمكن الحصول على tuple من القيم باستخدام values
.
التكرار على NamedTuple
s ينتج القيم بدون الأسماء. (انظر المثال أدناه.) للتكرار على أزواج الاسم-القيمة، استخدم دالة pairs
.
يمكن استخدام الماكرو @NamedTuple
للإعلان بشكل مريح عن أنواع 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
بطريقة مشابهة لكيفية تعريف الوسائط الرئيسية برمجيًا، يمكن إنشاء tuple مسمى عن طريق إعطاء أزواج name::Symbol => value
بعد فاصلة منقوطة داخل literal tuple. يمكن خلط هذا مع بناء جملة name=value
:
julia> (; :a => 1, :b => 2, c=3)
(a = 1, b = 2, c = 3)
يمكن أيضًا تقديم أزواج الاسم-القيمة عن طريق تفكيك tuple مسمى أو أي مكرر ينتج مجموعات ذات قيمتين تحمل كل منها رمزًا كقيمة أولى:
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) # القيمة النهائية لـ b تتجاوز القيمة من nt1
(a = 1, b = 20, c = 3, d = 4)
julia> (; zip(keys, values)...) # zip ينتج tuples مثل (:a, 1)
(a = 1, b = 2, c = 3)
كما هو الحال في الوسائط الرئيسية، تشير المعرفات وتعبيرات النقاط إلى الأسماء:
julia> x = 0
0
julia> t = (; x)
(x = 0,)
julia> (; t.x)
(x = 0,)
الأسماء الضمنية من المعرفات وتعبيرات النقاط متاحة اعتبارًا من Julia 1.5.
استخدام طرق getindex
مع عدة Symbol
s متاح اعتبارًا من Julia 1.7.
Base.@NamedTuple
— Macro@NamedTuple{key1::Type1, key2::Type2, ...}
@NamedTuple begin key1::Type1; key2::Type2; ...; end
تقدم هذه الماكرو صياغة أكثر ملاءمة لإعلان أنواع NamedTuple
. إنها تعيد نوع NamedTuple
مع المفاتيح والأنواع المعطاة، وهو ما يعادل NamedTuple{(:key1, :key2, ...), Tuple{Type1,Type2,...}}
. إذا تم حذف إعلان ::Type
، يتم اعتباره Any
. يسمح شكل begin ... end
بتقسيم الإعلانات عبر عدة أسطر (مشابه لإعلان struct
)، ولكنه متساوي بخلاف ذلك. يتم استخدام ماكرو NamedTuple
عند طباعة أنواع NamedTuple
إلى مثلاً REPL.
على سبيل المثال، تحتوي المجموعة (a=3.1, b="hello")
على نوع NamedTuple{(: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}
هذه الماكرو متاحة اعتبارًا من Julia 1.5.
Base.@Kwargs
— Macro@Kwargs{key1::Type1, key2::Type2, ...}
تقدم هذه الماكرو طريقة ملائمة لبناء تمثيل النوع لوسائط الكلمات الرئيسية من نفس بناء الجملة مثل @NamedTuple
. على سبيل المثال، عندما يكون لدينا استدعاء دالة مثل func([positional arguments]; kw1=1.0, kw2="2")
، يمكننا استخدام هذه الماكرو لبناء التمثيل الداخلي لنوع وسائط الكلمات الرئيسية كـ @Kwargs{kw1::Float64, kw2::String}
. تم تصميم بناء جملة الماكرو بشكل خاص لتبسيط نوع توقيع طريقة الكلمات الرئيسية عندما يتم طباعته في عرض تتبع المكدس.
julia> @Kwargs{init::Int} # التمثيل الداخلي لوسائط الكلمات الرئيسية
Base.Pairs{Symbol, Int64, Tuple{Symbol}, @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
هذه الماكرو متاحة اعتبارًا من Julia 1.10.
Base.Val
— TypeVal(c)
ارجع Val{c}()
, الذي لا يحتوي على بيانات وقت التشغيل. يمكن استخدام أنواع مثل هذه لنقل المعلومات بين الدوال من خلال القيمة c
، التي يجب أن تكون قيمة isbits
أو Symbol
. الغرض من هذا البناء هو القدرة على التوجيه على الثوابت مباشرة (في وقت الترجمة) دون الحاجة إلى اختبار قيمة الثابت في وقت التشغيل.
أمثلة
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"
Core.Vararg
— ConstantVararg{T,N}
يمكن أن تكون المعلمة الأخيرة من نوع التوبل Tuple
هي القيمة الخاصة Vararg
، التي تدل على أي عدد من العناصر اللاحقة. Vararg{T,N}
يتوافق مع بالضبط N
عنصر من النوع T
. وأخيرًا، Vararg{T}
يتوافق مع صفر أو أكثر من العناصر من النوع T
. تُستخدم أنواع توبل Vararg
لتمثيل المعاملات المقبولة من قبل طرق varargs (انظر القسم حول وظائف Varargs في الدليل).
انظر أيضًا NTuple
.
أمثلة
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
Core.Nothing
— TypeBase.isnothing
— Functionisnothing(x)
ارجع true
إذا كان x === nothing
، وارجع false
إذا لم يكن كذلك.
هذه الدالة تتطلب على الأقل Julia 1.1.
انظر أيضًا something
، Base.notnothing
، ismissing
.
Base.notnothing
— Functionnotnothing(x)
ارمِ خطأ إذا كان x === nothing
، وأعد x
إذا لم يكن كذلك.
Base.Some
— TypeSome{T}
نوع غلاف يُستخدم في Union{Some{T}, Nothing}
للتمييز بين غياب قيمة (nothing
) ووجود قيمة nothing
(أي Some(nothing)
).
استخدم something
للوصول إلى القيمة المغلفة بواسطة كائن Some
.
Base.something
— Functionشيء(x...)
ارجع أول قيمة في المعطيات التي لا تساوي nothing
، إن وجدت. وإلا، ارمِ خطأ. يتم فك تغليف المعطيات من نوع Some
.
انظر أيضًا coalesce
، skipmissing
، @something
.
أمثلة
julia> شيء(nothing, 1)
1
julia> شيء(Some(1), nothing)
1
julia> شيء(Some(nothing), 2) === nothing
true
julia> شيء(missing, nothing)
missing
julia> شيء(nothing, nothing)
ERROR: ArgumentError: لا توجد معطيات قيمة
Base.@something
— Macro@something(x...)
نسخة قصيرة من something
.
أمثلة
julia> f(x) = (println("f($x)"); nothing);
julia> a = 1;
julia> a = @something a f(2) f(3) error("غير قادر على العثور على افتراضي لـ `a`")
1
julia> b = nothing;
julia> b = @something b f(2) f(3) error("غير قادر على العثور على افتراضي لـ `b`")
f(2)
f(3)
ERROR: غير قادر على العثور على افتراضي لـ `b`
[...]
julia> b = @something b f(2) f(3) Some(nothing)
f(2)
f(3)
julia> b === nothing
true
هذه الماكرو متاحة اعتبارًا من جوليا 1.7.
Base.Enums.Enum
— TypeEnum{T<:Integer}
النوع الفائق المجرد لجميع الأنواع المعدودة المعرفة باستخدام @enum
.
Base.Enums.@enum
— Macro@enum EnumName[::BaseType] value1[=x] value2[=y]
أنشئ نوع فرعي من Enum{BaseType}
باسم EnumName
وقيم أعضاء التعداد value1
و value2
مع قيم اختيارية معينة لـ x
و y
، على التوالي. يمكن استخدام EnumName
مثل الأنواع الأخرى وقيم أعضاء التعداد كقيم عادية، مثل
أمثلة
julia> @enum Fruit apple=1 orange=2 kiwi=3
julia> f(x::Fruit) = "أنا فاكهة بقيمة: $(Int(x))"
f (دالة عامة مع 1 طريقة)
julia> f(apple)
"أنا فاكهة بقيمة: 1"
julia> Fruit(1)
apple::Fruit = 1
يمكن أيضًا تحديد القيم داخل كتلة begin
، على سبيل المثال
@enum EnumName begin
value1
value2
end
يجب أن يكون BaseType
، الذي يكون افتراضيًا Int32
، نوعًا بدائيًا فرعيًا من Integer
. يمكن تحويل قيم الأعضاء بين نوع التعداد و BaseType
. تقوم read
و write
بإجراء هذه التحويلات تلقائيًا. في حالة إنشاء التعداد بنوع BaseType
غير افتراضي، ستعيد Integer(value1)
القيمة الصحيحة value1
مع نوع BaseType
.
لإدراج جميع حالات التعداد، استخدم instances
، على سبيل المثال
julia> instances(Fruit)
(apple, orange, kiwi)
من الممكن إنشاء رمز من حالة التعداد:
julia> Symbol(apple)
:apple
Core.Expr
— TypeExpr(head::Symbol, args...)
نوع يمثل التعبيرات المركبة في كود جوليا المحلل (ASTs). تتكون كل تعبير من head
Symbol
يحدد نوع التعبير (مثل: استدعاء، حلقة for، عبارة شرطية، إلخ)، وتعبيرات فرعية (مثل: الوسائط في استدعاء). يتم تخزين التعبيرات الفرعية في حقل Vector{Any}
يسمى args
.
راجع الفصل في الدليل حول Metaprogramming و الوثائق الخاصة بالمطورين Julia ASTs.
أمثلة
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
Core.Symbol
— Typeرمز
نوع الكائن المستخدم لتمثيل المعرفات في كود جوليا المحلل (ASTs). يُستخدم أيضًا غالبًا كاسم أو علامة لتحديد كيان (على سبيل المثال، كمفتاح في القاموس). يمكن إدخال Symbol
s باستخدام عامل الاقتباس :
:
julia> :name
:name
julia> typeof(:name)
رمز
julia> x = 42
42
julia> eval(:x)
42
يمكن أيضًا إنشاء Symbol
s من السلاسل النصية أو القيم الأخرى عن طريق استدعاء المُنشئ Symbol(x...)
.
Symbol
s غير قابلة للتغيير وتنفيذها يعيد استخدام نفس الكائن لجميع Symbol
s بنفس الاسم.
على عكس السلاسل النصية، فإن Symbol
s هي كيانات "ذرية" أو "عددية" لا تدعم التكرار عبر الأحرف.
Core.Symbol
— MethodSymbol(x...) -> Symbol
قم بإنشاء Symbol
عن طريق دمج تمثيلات السلاسل الخاصة بالوسائط معًا.
أمثلة
julia> Symbol("my", "name")
:myname
julia> Symbol("day", 4)
:day4
Core.Module
— Typeالوحدة
الوحدة
هي مساحة عمل متغيرات عالمية منفصلة. انظر module
و قسم الدليل حول الوحدات للحصول على التفاصيل.
Module(name::Symbol=:anonymous, std_imports=true, default_names=true)
إرجاع وحدة بالاسم المحدد. baremodule
يتوافق مع Module(:ModuleName, false)
يمكن إنشاء وحدة فارغة لا تحتوي على أي أسماء على الإطلاق باستخدام Module(:ModuleName, false, false)
. هذه الوحدة لن تستورد Base
أو Core
ولا تحتوي على مرجع لنفسها.
Generic Functions
Core.Function
— Typeوظيفة
نوع مجرد لجميع الوظائف.
أمثلة
julia> isa(+, Function)
true
julia> typeof(sin)
typeof(sin) (نوع فردي للدالة sin، نوع فرعي من Function)
julia> ans <: Function
true
Base.hasmethod
— Functionhasmethod(f, t::Type{<:Tuple}[, kwnames]; world=get_world_counter()) -> Bool
حدد ما إذا كانت الدالة العامة المعطاة تحتوي على طريقة تتطابق مع Tuple
المعطى من أنواع المعاملات مع الحد الأعلى لعمر العالم المحدد بواسطة world
.
إذا تم توفير مجموعة من أسماء معاملات الكلمات الرئيسية kwnames
، فإن هذا يتحقق أيضًا مما إذا كانت الطريقة الخاصة بـ f
التي تتطابق مع t
تحتوي على أسماء معاملات الكلمات الرئيسية المعطاة. إذا كانت الطريقة المتطابقة تقبل عددًا متغيرًا من معاملات الكلمات الرئيسية، على سبيل المثال مع kwargs...
، فإن أي أسماء مقدمة في kwnames
تعتبر صالحة. خلاف ذلك، يجب أن تكون الأسماء المقدمة مجموعة فرعية من معاملات الكلمات الرئيسية للطريقة.
انظر أيضًا applicable
.
يتطلب توفير أسماء معاملات الكلمات الرئيسية وجود Julia 1.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
Core.applicable
— Functionapplicable(f, args...) -> Bool
حدد ما إذا كانت الدالة العامة المعطاة تحتوي على طريقة قابلة للتطبيق على المعطيات المعطاة.
انظر أيضًا hasmethod
.
أمثلة
julia> function f(x, y)
x + y
end;
julia> applicable(f, 1)
false
julia> applicable(f, 1, 2)
true
Base.isambiguous
— FunctionBase.isambiguous(m1, m2; ambiguous_bottom=false) -> Bool
حدد ما إذا كانت طريقتان m1
و m2
قد تكونان غامضتين لبعض توقيعات الاستدعاء. يتم إجراء هذا الاختبار في سياق طرق أخرى لنفس الدالة؛ في العزلة، قد تكون m1
و m2
غامضتين، ولكن إذا تم تعريف طريقة ثالثة تحل الغموض، فإن هذا يُرجع false
. بدلاً من ذلك، في العزلة قد تكون m1
و m2
مرتبتين، ولكن إذا لم يكن من الممكن ترتيب طريقة ثالثة معهما، فقد تتسببان في غموض معًا.
بالنسبة للأنواع البرامترية، يتحكم وسيط الكلمة الرئيسية ambiguous_bottom
في ما إذا كان Union{}
يُعتبر تقاطعًا غامضًا لمتغيرات النوع - عندما يكون true
، يُعتبر غامضًا، وعندما يكون false
لا يُعتبر كذلك.
أمثلة
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(methods(foo));
julia> typeintersect(m1.sig, m2.sig)
Tuple{typeof(foo), Complex{Union{}}}
julia> Base.isambiguous(m1, m2, ambiguous_bottom=true)
true
julia> Base.isambiguous(m1, m2, ambiguous_bottom=false)
false
Core.invoke
— Functioninvoke(f, argtypes::Type, args...; kwargs...)
استدعاء طريقة للدالة العامة المعطاة f
التي تطابق الأنواع المحددة argtypes
على الوسائط المحددة args
وتمرير الوسائط الرئيسية kwargs
. يجب أن تتوافق الوسائط args
مع الأنواع المحددة في argtypes
، أي أن التحويل لا يتم تلقائيًا. تتيح هذه الطريقة استدعاء طريقة غير الأكثر تحديدًا المطابقة، وهو أمر مفيد عندما تكون سلوك تعريف أكثر عمومية مطلوبًا بشكل صريح (غالبًا كجزء من تنفيذ طريقة أكثر تحديدًا لنفس الدالة).
كن حذرًا عند استخدام invoke
للوظائف التي لم تكتبها. ما هو التعريف المستخدم للأنواع المعطاة argtypes
هو تفصيل تنفيذي ما لم تنص الدالة صراحةً على أن الاستدعاء مع أنواع معينة argtypes
هو جزء من واجهة برمجة التطبيقات العامة. على سبيل المثال، يُعتبر التغيير بين f1
و f2
في المثال أدناه متوافقًا عادةً لأن التغيير غير مرئي للمتصل مع استدعاء عادي (غير invoke
). ومع ذلك، فإن التغيير مرئي إذا استخدمت invoke
.
أمثلة
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
Base.@invoke
— Macro@invoke f(arg::T, ...; kwargs...)
يوفر وسيلة مريحة لاستدعاء invoke
عن طريق توسيع @invoke f(arg1::T1, arg2::T2; kwargs...)
إلى invoke(f, Tuple{T1,T2}, arg1, arg2; kwargs...)
. عندما يتم حذف نوع المعامل، يتم استبداله بـ Core.Typeof
لذلك المعامل. لاستدعاء طريقة حيث يكون المعامل غير محدد النوع أو محدد صراحة كـ Any
، قم بتعليق المعامل بـ ::Any
.
كما أنه يدعم الصياغة التالية:
@invoke (x::X).f
يتوسع إلىinvoke(getproperty, Tuple{X,Symbol}, x, :f)
@invoke (x::X).f = v::V
يتوسع إلىinvoke(setproperty!, Tuple{X,Symbol,V}, x, :f, v)
@invoke (xs::Xs)[i::I]
يتوسع إلىinvoke(getindex, Tuple{Xs,I}, xs, i)
@invoke (xs::Xs)[i::I] = v::V
يتوسع إلىinvoke(setindex!, Tuple{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))
هذه الماكرو تتطلب جوليا 1.7 أو أحدث.
هذه الماكرو تم تصديرها اعتبارًا من جوليا 1.9.
الصياغة الإضافية مدعومة اعتبارًا من جوليا 1.10.
Base.invokelatest
— Functioninvokelatest(f, args...; kwargs...)
يستدعي f(args...; kwargs...)
، ولكنه يضمن أن يتم تنفيذ أحدث طريقة لـ f
. هذا مفيد في ظروف متخصصة، مثل حلقات الأحداث الطويلة أو دوال الاسترجاع التي قد تستدعي إصدارات قديمة من دالة f
. (العيب هو أن invokelatest
أبطأ قليلاً من استدعاء f
مباشرة، ولا يمكن للمجمع استنتاج نوع النتيجة.)
قبل Julia 1.9، لم يكن هذا الدالة مصدرة، وكان يتم استدعاؤها كـ Base.invokelatest
.
Base.@invokelatest
— Macro@invokelatest f(args...; kwargs...)
يوفر وسيلة مريحة لاستدعاء invokelatest
. سيتم توسيع @invokelatest f(args...; kwargs...)
ببساطة إلى Base.invokelatest(f, args...; kwargs...)
.
كما أنه يدعم الصيغة التالية:
@invokelatest x.f
يتوسع إلىBase.invokelatest(getproperty, x, :f)
@invokelatest x.f = v
يتوسع إلىBase.invokelatest(setproperty!, x, :f, v)
@invokelatest xs[i]
يتوسع إلىBase.invokelatest(getindex, xs, i)
@invokelatest xs[i] = v
يتوسع إلىBase.invokelatest(setindex!, xs, v, i)
julia> @macroexpand @invokelatest f(x; kw=kwv)
:(Base.invokelatest(f, x; kw = kwv))
julia> @macroexpand @invokelatest x.f
:(Base.invokelatest(Base.getproperty, x, :f))
julia> @macroexpand @invokelatest x.f = v
:(Base.invokelatest(Base.setproperty!, x, :f, v))
julia> @macroexpand @invokelatest xs[i]
:(Base.invokelatest(Base.getindex, xs, i))
julia> @macroexpand @invokelatest xs[i] = v
:(Base.invokelatest(Base.setindex!, xs, v, i))
تتطلب هذه الماكرو Julia 1.7 أو أحدث.
قبل Julia 1.9، لم تكن هذه الماكرو مصدرة، وكانت تُسمى Base.@invokelatest
.
تتطلب الصيغة الإضافية x.f
و xs[i]
Julia 1.10.
new
— Keywordnew، أو new{A,B,...}
دالة خاصة متاحة للبانيين الداخليين التي تنشئ كائنًا جديدًا من النوع. الشكل new{A,B,...} يحدد صراحةً قيم المعلمات لأنواع المعلمات. راجع قسم الدليل حول طرق الباني الداخلي لمزيد من المعلومات.
Base.:|>
— Function|>(x, f)
عامل infix الذي يطبق الدالة 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
Base.:∘
— Functionf ∘ g
تأليف الدوال: أي أن (f ∘ g)(args...; kwargs...)
تعني f(g(args...; kwargs...))
. يمكن إدخال الرمز ∘
في REPL الخاص بـ Julia (ومعظم المحررات، إذا تم تكوينها بشكل مناسب) عن طريق كتابة \circ<tab>
.
تعمل تأليف الدوال أيضًا في الشكل البادئ: ∘(f, g)
هو نفسه f ∘ g
. يدعم الشكل البادئ تأليف دوال متعددة: ∘(f, g, h) = f ∘ g ∘ h
وفتح ∘(fs...)
لتأليف مجموعة قابلة للتكرار من الدوال. يتم تنفيذ آخر معطى لـ ∘
أولاً.
يتطلب تأليف دوال متعددة على الأقل Julia 1.4.
يتطلب تأليف دالة واحدة ∘(f) على الأقل Julia 1.5.
يتطلب استخدام معطيات الكلمات الرئيسية على الأقل Julia 1.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
، !f::Function
.
Base.ComposedFunction
— TypeComposedFunction{Outer,Inner} <: Function
يمثل تركيب كائنين قابلين للاستدعاء outer::Outer
و inner::Inner
. أي
ComposedFunction(outer, inner)(args...; kw...) === outer(inner(args...; kw...))
الطريقة المفضلة لإنشاء مثيل من ComposedFunction
هي استخدام عامل التركيب ∘
:
julia> sin ∘ cos === ComposedFunction(sin, cos)
true
julia> typeof(sin∘cos)
ComposedFunction{typeof(sin), typeof(cos)}
تُخزن الأجزاء المركبة في حقول ComposedFunction
ويمكن استرجاعها كما يلي:
julia> composition = sin ∘ cos
sin ∘ cos
julia> composition.outer === sin
true
julia> composition.inner === cos
true
يتطلب ComposedFunction
على الأقل Julia 1.6. في الإصدارات السابقة، يعيد ∘
دالة مجهولة بدلاً من ذلك.
انظر أيضًا ∘
.
Base.splat
— Functionsplat(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
Base.Fix1
— TypeFix1(f, x)
نوع يمثل نسخة جزئية التطبيق من الدالة ذات المعاملين f
، مع تثبيت المعامل الأول على القيمة "x". بعبارة أخرى، فإن Fix1(f, x)
يتصرف بشكل مشابه لـ y->f(x, y)
.
انظر أيضًا Fix2
.
Base.Fix2
— TypeFix2(f, x)
نوع يمثل نسخة جزئية التطبيق من الدالة ذات المعاملين f
، مع تثبيت المعامل الثاني على القيمة "x". بعبارة أخرى، فإن Fix2(f, x)
يتصرف بشكل مشابه لـ y->f(y, x)
.
Syntax
Core.eval
— FunctionCore.eval(m::Module, expr)
قم بتقييم تعبير في الوحدة المعطاة وأعد النتيجة.
eval
— Functioneval(expr)
قم بتقييم تعبير في النطاق العالمي للوحدة المحتوية. كل Module
(باستثناء تلك المعرفة باستخدام baremodule
) لديها تعريف خاص بها من 1-حجة لـ eval
، والذي يقوم بتقييم التعبيرات في تلك الوحدة.
Base.@eval
— Macro@eval [mod,] ex
قم بتقييم تعبير مع القيم المدخلة فيه باستخدام eval
. إذا تم توفير وسيطتين، فإن الأولى هي الوحدة التي سيتم التقييم فيها.
Base.evalfile
— Functionevalfile(path::AbstractString, args::Vector{String}=String[])
قم بتحميل الملف إلى وحدة مجهولة باستخدام include
، قم بتقييم جميع التعبيرات، وأعد قيمة التعبير الأخير. يمكن استخدام الوسيطة الاختيارية args
لتعيين مدخلات البرنامج النصي (أي المتغير العالمي ARGS
). لاحظ أن التعريفات (مثل الطرق، والمتغيرات العالمية) يتم تقييمها في الوحدة المجهولة ولا تؤثر على الوحدة الحالية.
أمثلة
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")
Base.esc
— Functionesc(e)
صالح فقط في سياق Expr
الذي تم إرجاعه من ماكرو. يمنع تمرير نظافة الماكرو من تحويل المتغيرات المضمنة إلى متغيرات جينسيم. راجع قسم Macros في فصل البرمجة الميتا في الدليل لمزيد من التفاصيل والأمثلة.
Base.@inbounds
— Macro@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
!!! تحذير استخدام @inbounds
قد يؤدي إلى نتائج غير صحيحة/تعطل/فساد للموشرات خارج الحدود. المستخدم مسؤول عن التحقق من ذلك يدويًا. استخدم @inbounds
فقط عندما يكون من المؤكد من المعلومات المتاحة محليًا أن جميع الوصولات ضمن الحدود. على وجه الخصوص، استخدام 1:length(A)
بدلاً من eachindex(A)
في دالة مثل تلك أعلاه ليس ضمن الحدود بأمان لأن الفهرس الأول لـ A
قد لا يكون 1
لجميع الأنواع المعرفة من قبل المستخدم التي تشتق من AbstractArray
.
Base.@boundscheck
— Macro@boundscheck(blk)
يُعلّم التعبير blk
ككتلة فحص حدود، مما يسمح بإلغائها بواسطة @inbounds
.
!!! ملاحظة يجب أن تكون الدالة التي كُتبت فيها @boundscheck
مضمنة في المتصل بها لكي يكون لـ @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]"
!!! تحذير يسمح لك توضيح @boundscheck
، ككاتب مكتبة، بالاختيار للسماح لشفرة أخرى بإزالة فحوصات الحدود الخاصة بك باستخدام @inbounds
. كما هو مذكور هناك، يجب على المتصل التحقق - باستخدام المعلومات التي يمكنهم الوصول إليها - من أن وصولاتهم صحيحة قبل استخدام @inbounds
. على سبيل المثال، بالنسبة للفهرسة في فئات AbstractArray
الفرعية الخاصة بك، يتضمن ذلك التحقق من الفهارس مقابل axes
الخاصة بها. لذلك، يجب إضافة توضيحات @boundscheck
فقط إلى تنفيذ getindex
أو setindex!
بعد أن تكون متأكدًا من أن سلوكها صحيح.
Base.@propagate_inbounds
— Macro@propagate_inbounds
يخبر المترجم بإدراج دالة مع الاحتفاظ بسياق حدود المتصل.
Base.@inline
— Macro@inline
أعطِ تلميحًا للمترجم بأن هذه الدالة تستحق أن تُدرج.
عادةً لا تحتاج الدوال الصغيرة إلى توضيح @inline
، حيث يقوم المترجم بذلك تلقائيًا. من خلال استخدام @inline
على الدوال الأكبر، يمكن إعطاء دفعة إضافية للمترجم لإدراجها.
يمكن تطبيق @inline
مباشرةً قبل تعريف دالة أو داخل جسم دالة.
# توضيح تعريف طويل
@inline function longdef(x)
...
end
# توضيح تعريف قصير
@inline shortdef(x) = ...
# توضيح دالة مجهولة ينشئها كتلة `do`
f() do
@inline
...
end
يتطلب الاستخدام داخل جسم دالة على الأقل Julia 1.8.
@inline block
أعطِ تلميحًا للمترجم بأن الاستدعاءات داخل block
تستحق أن تُدرج.
# سيحاول المترجم إدراج `f`
@inline f(...)
# سيحاول المترجم إدراج `f` و `g` و `+`
@inline f(...) + g(...)
دائمًا ما يكون لتوضيح موقع الاستدعاء أولوية على التوضيح المطبق على تعريف الدالة المستدعاة:
@noinline function explicit_noinline(args...)
# الجسم
end
let
@inline explicit_noinline(args...) # سيتم إدراجه
end
عندما تكون هناك توضيحات لمواقع استدعاء متداخلة، فإن التوضيح الأكثر عمقًا له الأولوية:
@noinline let a0, b0 = ...
a = @inline f(a0) # سيحاول المترجم إدراج هذا الاستدعاء
b = f(b0) # لن يحاول المترجم إدراج هذا الاستدعاء
return a, b
end
على الرغم من أن توضيح موقع الاستدعاء سيحاول فرض الإدراج بغض النظر عن نموذج التكلفة، لا تزال هناك فرص لعدم نجاحه في ذلك. خاصةً، لا يمكن إدراج الاستدعاءات التكرارية حتى لو تم توضيحها كـ @inline
d.
يتطلب توضيح موقع الاستدعاء على الأقل Julia 1.8.
Base.@noinline
— Macro@noinline
أعطِ تلميحًا للمترجم بأنه يجب ألا يقوم بإدماج دالة.
عادةً ما يتم إدماج الدوال الصغيرة تلقائيًا. من خلال استخدام @noinline
على الدوال الصغيرة، يمكن منع الإدماج التلقائي.
يمكن تطبيق @noinline
مباشرةً قبل تعريف دالة أو داخل جسم دالة.
# توضيح تعريف طويل
@noinline function longdef(x)
...
end
# توضيح تعريف قصير
@noinline shortdef(x) = ...
# توضيح دالة مجهولة ينشئها كتلة `do`
f() do
@noinline
...
end
يتطلب الاستخدام داخل جسم دالة على الأقل Julia 1.8.
@noinline block
أعطِ تلميحًا للمترجم بأنه يجب ألا يقوم بإدماج الاستدعاءات داخل block
.
# سيحاول المترجم عدم إدماج `f`
@noinline f(...)
# سيحاول المترجم عدم إدماج `f` و `g` و `+`
@noinline f(...) + g(...)
دائمًا ما يكون لتوضيح موقع الاستدعاء أولوية على التوضيح المطبق على تعريف الدالة المستدعاة:
@inline function explicit_inline(args...)
# الجسم
end
let
@noinline explicit_inline(args...) # لن يتم إدماجها
end
عندما تكون هناك توضيحات لمواقع استدعاء متداخلة، فإن التوضيح الأعمق له الأولوية:
@inline let a0, b0 = ...
a = @noinline f(a0) # لن يحاول المترجم إدماج هذا الاستدعاء
b = f(b0) # سيحاول المترجم إدماج هذا الاستدعاء
return a, b
end
يتطلب توضيح موقع الاستدعاء على الأقل Julia 1.8.
إذا كانت الدالة تافهة (على سبيل المثال تعيد ثابتًا) فقد يتم إدماجها على أي حال.
Base.@nospecialize
— Macro@nospecialize
عند تطبيقها على اسم وسيط دالة، تشير إلى المترجم بأن تنفيذ الطريقة يجب ألا يكون متخصصًا لأنواع مختلفة من ذلك الوسيط، بل يجب استخدام النوع المعلن لذلك الوسيط. يمكن تطبيقها على وسيط ضمن قائمة الوسائط الرسمية، أو في جسم الدالة. عند تطبيقها على وسيط، يجب أن يحيط الماكرو بالتعبير الكامل للوسيط، مثل @nospecialize(x::Real)
أو @nospecialize(i::Integer...)
بدلاً من إحاطة اسم الوسيط فقط. عند استخدامها في جسم الدالة، يجب أن يحدث الماكرو في موضع البيان وقبل أي كود.
عند استخدامها بدون وسائط، فإنها تنطبق على جميع الوسائط في النطاق الأبوي. في النطاق المحلي، يعني هذا جميع الوسائط للدالة المحتوية. في النطاق العالمي (على المستوى الأعلى)، يعني هذا جميع الطرق التي تم تعريفها لاحقًا في الوحدة الحالية.
يمكن إعادة التخصص إلى الوضع الافتراضي باستخدام @specialize
.
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
!!! ملاحظة @nospecialize
تؤثر على توليد الكود ولكن ليس على الاستدلال: إنها تحد من تنوع الكود الأصلي الناتج، لكنها لا تفرض أي قيود (بخلاف القيود القياسية) على استدلال النوع. استخدم Base.@nospecializeinfer
مع @nospecialize
لقمع الاستدلال بشكل إضافي.
أمثلة
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)
م ensuring that only one version of native code will be generated for g
, one that is generic for any AbstractArray
. ومع ذلك، لا يزال يتم استنتاج نوع الإرجاع المحدد لكل من g
و f
، ولا يزال يتم استخدام هذا في تحسين المتصلين بـ f
و g
.
Base.@specialize
— Macro@specialize
إعادة تعيين تلميح التخصص لوسيط إلى القيمة الافتراضية. لمزيد من التفاصيل، انظر @nospecialize
.
Base.@nospecializeinfer
— MacroBase.@nospecializeinfer function f(args...)
@nospecialize ...
...
end
Base.@nospecializeinfer f(@nospecialize args...) = ...
يخبر المترجم باستنتاج f
باستخدام الأنواع المعلنة للوسائط @nospecialize
. يمكن استخدام ذلك للحد من عدد التخصصات التي ينشئها المترجم أثناء الاستنتاج.
أمثلة
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::AbstractArray
، مما يعني أن المترجم لن يرى على الأرجح الوقت الزائد للاستنتاج عليه بينما لا يمكنه استنتاج نوع الإرجاع المحدد له. بدون @nospecializeinfer
، كان من الممكن أن يستنتج f([1.0])
نوع الإرجاع لـ g
كـ Float64
، مما يشير إلى أن الاستنتاج تم على g(::Vector{Float64})
على الرغم من الحظر على إنشاء كود متخصص.
يتطلب استخدام Base.@nospecializeinfer
إصدار جوليا 1.10.
Base.@constprop
— MacroBase.@constprop إعداد [ex]
تحكم في وضع انتشار الثوابت بين الإجراءات للدالة المعلنة.
يدعم اثنان من الإعدادات
:
Base.@constprop :aggressive [ex]
: تطبيق انتشار الثوابت بشكل عدواني. بالنسبة لطريقة تعتمد نوع الإرجاع على قيمة المعاملات، يمكن أن يؤدي ذلك إلى تحسين نتائج الاستدلال على حساب وقت التجميع الإضافي.Base.@constprop :none [ex]
: تعطيل انتشار الثوابت. يمكن أن يقلل ذلك من أوقات التجميع للدوال التي قد تعتبرها جوليا جديرة بانتشار الثوابت. الحالات الشائعة هي للدوال التي تحتوي على معاملات ذات قيمBool
أوSymbol
أو معاملات مفتاحية.
يمكن تطبيق Base.@constprop
مباشرة قبل تعريف دالة أو داخل جسم دالة.
# توضيح تعريف طويل
Base.@constprop :aggressive function longdef(x)
...
end
# توضيح تعريف قصير
Base.@constprop :aggressive shortdef(x) = ...
# توضيح دالة مجهولة ينشئها كتلة `do`
f() do
Base.@constprop :aggressive
...
end
يتطلب الاستخدام داخل جسم دالة على الأقل جوليا 1.10.
Base.gensym
— Functiongensym([tag])
يولد رمزًا لن يتعارض مع أسماء المتغيرات الأخرى (في نفس الوحدة).
Base.@gensym
— Macro@gensym
يولد رمز gensym لمتغير. على سبيل المثال، يتم تحويل @gensym x y
إلى x = gensym("x"); y = gensym("y")
.
var"name"
— Keywordvar
تشير الصيغة var"#example#"
إلى متغير يسمى Symbol("#example#")
، على الرغم من أن #example#
ليس اسم معرف صالح في جوليا.
يمكن أن يكون هذا مفيدًا للتوافق مع لغات البرمجة التي لديها قواعد مختلفة لبناء المعرفات الصالحة. على سبيل المثال، للإشارة إلى المتغير R
draw.segments
، يمكنك استخدام var"draw.segments"
في كود جوليا الخاص بك.
يتم استخدامه أيضًا لـ show
كود جوليا المصدر الذي مر عبر نظافة الماكرو أو يحتوي على أسماء متغيرات لا يمكن تحليلها بشكل طبيعي.
لاحظ أن هذه الصيغة تتطلب دعم المحلل، لذا يتم توسيعها مباشرة بواسطة المحلل بدلاً من تنفيذها كـ ماكرو سلسلة عادية @var_str
.
تتطلب هذه الصيغة على الأقل جوليا 1.3.
Base.@goto
— Macro@goto name
@goto name
يقفز بلا شروط إلى العبارة في الموقع @label name
.
لا يمكن لـ @label
و @goto
إنشاء قفزات إلى عبارات من المستوى الأعلى المختلفة. محاولات القيام بذلك تسبب خطأ. لاستخدام @goto
، قم بتضمين @label
و @goto
في كتلة.
Base.@label
— Macro@label name
يضع علامة على بيان بالعلامة الرمزية name
. تشير العلامة إلى نقطة النهاية لانتقال غير مشروط باستخدام @goto name
.
Base.SimdLoop.@simd
— Macro@simd
قم بتعليق حلقة for
للسماح للمترجم بأخذ حريات إضافية للسماح بإعادة ترتيب الحلقات
!!! تحذير هذه الميزة تجريبية وقد تتغير أو تختفي في الإصدارات المستقبلية من جوليا. قد يتسبب الاستخدام غير الصحيح لماكرو @simd
في نتائج غير متوقعة.
يجب أن يكون الكائن الذي يتم التكرار عليه في حلقة @simd for
نطاقًا أحادي البعد. من خلال استخدام @simd
، أنت تؤكد عدة خصائص للحلقة:
- من الآمن تنفيذ التكرارات بترتيب عشوائي أو متداخل، مع اعتبار خاص لمتغيرات الاختزال.
- يمكن إعادة ترتيب أو تقليص العمليات العائمة على متغيرات الاختزال، مما قد يتسبب في نتائج مختلفة مقارنةً بدون
@simd
.
في العديد من الحالات، تتمكن جوليا من تحويل الحلقات الداخلية تلقائيًا إلى شكل متجه دون استخدام @simd
. يمنح استخدام @simd
المترجم مزيدًا من الحرية لجعل ذلك ممكنًا في المزيد من الحالات. في كلتا الحالتين، يجب أن تحتوي حلقتك الداخلية على الخصائص التالية للسماح بالتوجيه المتجه:
- يجب أن تكون الحلقة حلقة داخلية.
- يجب أن يكون جسم الحلقة كودًا خطيًا. لذلك،
@inbounds
مطلوب حاليًا لجميع الوصولات إلى المصفوفات. يمكن أن يقوم المترجم أحيانًا بتحويل تعبيرات&&
و||
و?:
القصيرة إلى كود خطي إذا كان من الآمن تقييم جميع المعاملات بشكل غير مشروط. ضع في اعتبارك استخدام دالةifelse
بدلاً من?:
في الحلقة إذا كان من الآمن القيام بذلك. - يجب أن تحتوي الوصولات على نمط خطوة ولا يمكن أن تكون "تجمعات" (قراءات عشوائية) أو "تشتتات" (كتابات عشوائية).
- يجب أن تكون الخطوة خطوة وحدة.
!!! ملاحظة لا يؤكد @simd
بشكل افتراضي أن الحلقة خالية تمامًا من الاعتماديات على الذاكرة التي تحملها الحلقة، وهو افتراض يمكن انتهاكه بسهولة في الكود العام. إذا كنت تكتب كودًا غير عام، يمكنك استخدام @simd ivdep for ... end
لتأكيد أيضًا أن:
- لا توجد اعتمادات على الذاكرة تحملها الحلقة
- لا تنتظر أي تكرار على تكرار سابق لتحقيق تقدم للأمام.
Base.@polly
— Macro@polly
يخبر المترجم بتطبيق المحسّن متعدد الأبعاد بولي على دالة.
Base.@generated
— Macro@generated f
@generated
يُستخدم لوصف دالة سيتم إنشاؤها. في جسم الدالة المُنشأة، يمكن قراءة أنواع المعاملات فقط (وليس القيم). الدالة تُرجع تعبيرًا مُقتبسًا يتم تقييمه عند استدعاء الدالة. يجب عدم استخدام ماكرو @generated
على الدوال التي تُغير النطاق العالمي أو تعتمد على عناصر قابلة للتغيير.
انظر Metaprogramming لمزيد من التفاصيل.
أمثلة
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"
Base.@assume_effects
— MacroBase.@assume_effects إعداد... [ex]
تجاوز نمذجة تأثير المترجم. يمكن استخدام هذه الماكرو في عدة سياقات:
- مباشرة قبل تعريف طريقة، لتجاوز نمذجة التأثير الكاملة للطريقة المطبقة.
- داخل جسم دالة بدون أي وسائط، لتجاوز نمذجة التأثير الكاملة للطريقة المحيطة.
- تطبيقها على كتلة من التعليمات البرمجية، لتجاوز نمذجة التأثير المحلية لكتلة التعليمات البرمجية المطبقة.
أمثلة
julia> Base.@assume_effects :terminates_locally function fact(x)
# الاستخدام 1:
# هذا :terminates_locally يسمح لـ `fact` بأن يتم طيّه بشكل ثابت
res = 1
0 ≤ x < 20 || error("خطأ في العامل")
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
# الاستخدام 2:
# هذا :terminates_locally يسمح لهذه الدالة المجهولة بأن يتم طيّها بشكل ثابت
Base.@assume_effects :terminates_locally
res = 1
0 ≤ x < 20 || error("خطأ في العامل")
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("خطأ في العامل")
# الاستخدام 3:
# مع هذه التعليمة :terminates_locally يتجاوز المترجم تلوين
# تأثير `:terminates` داخل هذه الكتلة `while`، مما يسمح للدالة
# المجهولة الأم بأن يتم طيّها بشكل ثابت
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}
استخدام Base.@assume_effects
يتطلب إصدار جوليا 1.8.
يتطلب الاستخدام داخل جسم دالة على الأقل جوليا 1.10.
تتطلب تعليمة كتلة التعليمات البرمجية على الأقل جوليا 1.11.
الاستخدام غير الصحيح لهذه الماكرو يسبب سلوك غير محدد (بما في ذلك الأعطال، أو الإجابات غير الصحيحة، أو أخطاء أخرى يصعب تتبعها). استخدم بحذر وفقط كملاذ أخير إذا كان ذلك مطلوبًا بشدة. حتى في مثل هذه الحالة، يجب عليك اتخاذ جميع الخطوات الممكنة لتقليل قوة تأكيد التأثير (على سبيل المثال، لا تستخدم :total
إذا كان :nothrow
سيكون كافيًا).
بشكل عام، كل قيمة setting
تقوم بعمل تأكيد حول سلوك الدالة، دون الحاجة إلى أن يثبت المترجم أن هذا السلوك صحيح بالفعل. يتم إجراء هذه التأكيدات لجميع أعمار العالم. لذلك، من المستحسن الحد من استخدام الدوال العامة التي قد يتم توسيعها لاحقًا لإبطال الافتراض (مما قد يسبب سلوكًا غير محدد).
القيم setting
التالية مدعومة.
:consistent
:effect_free
:nothrow
:terminates_globally
:terminates_locally
:notaskstate
:inaccessiblememonly
:noub
:noub_if_noinbounds
:nortcall
:foldable
:removable
:total
مساعدة موسعة
:consistent
تؤكد إعداد :consistent
أنه بالنسبة للمدخلات المتساوية (===
):
- طريقة إنهاء التنفيذ (قيمة الإرجاع، استثناء، عدم إنهاء) ستكون دائمًا هي نفسها.
- إذا كانت الطريقة تعيد قيمة، فستكون النتائج دائمًا متساوية.
هذا يعني بشكل خاص أن الطريقة يجب ألا تعيد كائنًا قابلًا للتعديل تم تخصيصه حديثًا. تعدد تخصيصات الكائنات القابلة للتعديل (حتى مع محتويات متطابقة) ليست متساوية.
يتم إجراء تأكيد :consistent
-cy حسب أعمار العالم. بشكل أكثر رسمية، اكتب $fᵢ$ لتقييم $f$ في عمر العالم $i$، ثم يتطلب هذا الإعداد:
\[∀ i, x, y: x ≡ y → fᵢ(x) ≡ fᵢ(y)\]
ومع ذلك، بالنسبة لعمرين عالميين $i$، $j$ بحيث $i ≠ j$، قد يكون لدينا $fᵢ(x) ≢ fⱼ(y)$.
implication إضافي هو أن دوال :consistent
قد لا تجعل قيمة الإرجاع الخاصة بها تعتمد على حالة الكومة أو أي حالة عالمية أخرى ليست ثابتة لعمر العالم المعطى.
تشمل :consistent
-cy جميع إعادة الكتابة القانونية التي يقوم بها المحسن. على سبيل المثال، تعتبر عمليات fastmath العائمة غير :consistent
، لأن المحسن قد يعيد كتابتها مما يتسبب في عدم كون المخرجات :consistent
، حتى لنفس عمر العالم (على سبيل المثال، لأن أحدها تم تشغيله في المفسر، بينما تم تحسين الآخر).
إذا كانت دوال :consistent
تنتهي بإلقاء استثناء، فإن هذا الاستثناء نفسه ليس مطلوبًا للامتثال لمتطلبات المساواة المحددة أعلاه.
:effect_free
تؤكد إعداد :effect_free
أن الطريقة خالية من الآثار الجانبية المرئية بشكل خارجي. القائمة التالية غير مكتملة من الآثار الجانبية المرئية بشكل خارجي:
- تغيير قيمة متغير عالمي.
- تغيير الكومة (على سبيل المثال، مصفوفة أو قيمة قابلة للتعديل)، باستثناء ما هو مذكور أدناه
- تغيير جدول الطرق (على سبيل المثال، من خلال استدعاءات إلى eval)
- إدخال/إخراج الملفات/الشبكة/إلخ.
- تبديل المهام
ومع ذلك، فإن ما يلي ليس مرئيًا بشكل صريح، حتى لو كان يمكن ملاحظته:
- تخصيص الذاكرة (كلاهما قابل للتعديل وغير قابل للتعديل)
- الوقت المنقضي
- جمع القمامة
- تغييرات الكومة على الكائنات التي لا تتجاوز مدة حياتها الطريقة (أي تم تخصيصها في الطريقة ولا تهرب).
- القيمة المعادة (التي تكون مرئية خارجيًا، ولكنها ليست تأثيرًا جانبيًا)
قاعدة الإبهام هنا هي أن أي تأثير جانبي مرئي خارجي هو أي شيء قد يؤثر على تنفيذ بقية البرنامج إذا لم يتم تنفيذ الدالة.
يتم إجراء تأكيد :effect_free
لكل من الطريقة نفسها وأي كود يتم تنفيذه بواسطة الطريقة. تذكر أن التأكيد يجب أن يكون صالحًا لجميع أعمار العالم وقيود استخدام هذا التأكيد وفقًا لذلك.
:nothrow
تؤكد إعداد :nothrow
أن هذه الطريقة لا تلقي استثناء (أي ستعيد دائمًا قيمة أو لن تعيد أبدًا).
يُسمح للطُرق المعلّمة بـ :nothrow
باستخدام معالجة الاستثناءات داخليًا طالما أن الاستثناء لا يُعاد إلقاؤه خارج الطريقة نفسها.
إذا كانت تنفيذ طريقة ما قد يثير MethodError
s واستثناءات مشابهة، فإن الطريقة لا تعتبر :nothrow
. ومع ذلك، لاحظ أن الأخطاء المعتمدة على البيئة مثل StackOverflowError
أو InterruptException
لا يتم نمذجتها بواسطة هذا التأثير وبالتالي فإن الطريقة التي قد تؤدي إلى StackOverflowError
لا تحتاج بالضرورة إلى أن تكون !:nothrow
(على الرغم من أنه يجب عادةً أن تكون !:terminates
أيضًا).
:terminates_globally
تؤكد إعداد :terminates_globally
أن هذه الطريقة ستنتهي في النهاية (إما بشكل طبيعي أو غير طبيعي)، أي أنها لا تتكرر إلى ما لا نهاية.
يغطي تأكيد :terminates_globally
أي طرق أخرى يتم استدعاؤها بواسطة الطريقة المعلّمة.
سيعتبر المترجم هذا مؤشرًا قويًا على أن الطريقة ستنتهي نسبيًا بسرعة وقد (إذا كان ذلك قانونيًا) يستدعي هذه الطريقة في وقت الترجمة. أي أنه من غير الجيد وضع علامة على هذا الإعداد على طريقة تنتهي تقنيًا، ولكن ليس عمليًا.
:terminates_locally
تعتبر إعداد :terminates_locally
مثل :terminates_globally
، باستثناء أنها تنطبق فقط على تدفق التحكم النحوي داخل الطريقة المعلّمة. وبالتالي، فهي تأكيد أضعف بكثير (وبالتالي أكثر أمانًا) يسمح بإمكانية عدم الإنهاء إذا استدعت الطريقة بعض الطرق الأخرى التي لا تنتهي.
:terminates_globally
تعني :terminates_locally
.
:notaskstate
تؤكد إعداد :notaskstate
أن الطريقة لا تستخدم أو تعدل حالة المهمة المحلية (تخزين محلي للمهمة، حالة RNG، إلخ) وبالتالي يمكن نقلها بأمان بين المهام دون نتائج مرئية.
تستخدم تنفيذ معالجة الاستثناءات حالة مخزنة في كائن المهمة. ومع ذلك، لا تعتبر هذه الحالة حاليًا ضمن نطاق :notaskstate
ويتم تتبعها بشكل منفصل باستخدام تأثير :nothrow
.
يتعلق تأكيد :notaskstate
بحالة المهمة الجارية حاليًا. إذا تم الحصول على مرجع إلى كائن Task
بواسطة وسائل أخرى لا تأخذ في الاعتبار أي مهمة هي حاليًا جارية، فلا حاجة لتلويث تأثير :notaskstate
. هذا صحيح، حتى لو كان كائن المهمة المذكور يحدث أن يكون ===
للمهمة الجارية حاليًا.
عادةً ما يؤدي الوصول إلى حالة المهمة أيضًا إلى تلويث تأثيرات أخرى، مثل :effect_free
(إذا تم تعديل حالة المهمة) أو :consistent
(إذا تم استخدام حالة المهمة في حساب النتيجة). على وجه الخصوص، قد يتم حذف الكود الذي ليس :notaskstate
، ولكنه :effect_free
و :consistent
وبالتالي تمت ترقيته إلى :total
.
:inaccessiblememonly
تؤكد إعداد :inaccessiblememonly
أن الطريقة لا تصل إلى أو تعدل الذاكرة القابلة للتعديل المرئية خارجيًا. هذا يعني أن الطريقة يمكن أن تصل إلى أو تعدل الذاكرة القابلة للتعديل للكائنات المخصصة حديثًا التي لا يمكن الوصول إليها بواسطة طرق أخرى أو تنفيذ على المستوى الأعلى قبل العودة من الطريقة، ولكن لا يمكنها الوصول إلى أو تعديل أي حالة عالمية قابلة للتعديل أو ذاكرة قابلة للتعديل تشير إليها وسائطها.
أدناه قائمة غير مكتملة من الأمثلة التي تبطل هذا الافتراض:
- مرجع عالمي أو استدعاء
getglobal
للوصول إلى متغير عالمي قابل للتعديل - تعيين عالمي أو استدعاء
setglobal!
لإجراء تعيين لمتغير عالمي غير ثابت - استدعاء
setfield!
الذي يغير حقل متغير عالمي قابل للتعديل
يغطي تأكيد :inaccessiblememonly
أي طرق أخرى يتم استدعاؤها بواسطة الطريقة المعلّمة.
:noub
تؤكد إعداد :noub
أن الطريقة لن تنفذ أي سلوك غير محدد (لأي مدخلات). لاحظ أن السلوك غير المحدد قد يتسبب تقنيًا في انتهاك الطريقة لأي تأكيدات تأثير أخرى (مثل :consistent
أو :effect_free
) أيضًا، ولكننا لا نقوم بنمذجتها، ويفترضون غياب السلوك غير المحدد.
:nortcall
تؤكد إعداد :nortcall
أن الطريقة لا تستدعي Core.Compiler.return_type
، وأن أي طرق أخرى قد تستدعيها هذه الطريقة لا تستدعي أيضًا Core.Compiler.return_type
.
لتكون دقيقًا، يمكن استخدام هذا التأكيد عندما لا يتم إجراء استدعاء لـ Core.Compiler.return_type
في وقت التشغيل؛ أي، عندما تكون نتيجة Core.Compiler.return_type
معروفة تمامًا في وقت الترجمة وتم حذف الاستدعاء بواسطة المحسن. ومع ذلك، نظرًا لأن ما إذا كانت نتيجة Core.Compiler.return_type
قد تم طيها في وقت الترجمة يعتمد بشدة على تنفيذ المترجم، فمن المخاطر عمومًا تأكيد ذلك إذا كانت الطريقة المعنية تستخدم Core.Compiler.return_type
بأي شكل من الأشكال.
:foldable
تعتبر هذه الإعدادات اختصارًا مريحًا لمجموعة التأثيرات التي يتطلبها المترجم لضمان طي ثابت لاستدعاء في وقت الترجمة. وهي حاليًا تعادل الإعدادات التالية:
:consistent
:effect_free
:terminates_globally
:noub
:nortcall
لا تتضمن هذه القائمة بشكل خاص :nothrow
. سيظل المترجم يحاول نقل الثوابت ويلاحظ أي خطأ تم إلقاؤه في وقت الترجمة. لاحظ مع ذلك، أنه بموجب متطلبات :consistent
-cy، يجب أن يلقي أي استدعاء معلم بهذه الطريقة خطأ بشكل ثابت بالنظر إلى نفس قيم الوسائط.
ستعطل التعليمة @inbounds
الصريحة داخل الدالة أيضًا طي الثوابت ولن يتم تجاوزها بواسطة :foldable
.
:removable
تعتبر هذه الإعدادات اختصارًا مريحًا لمجموعة التأثيرات التي يتطلبها المترجم لضمان حذف استدعاء لم يتم استخدام نتيجته في وقت الترجمة. وهي حاليًا تعادل الإعدادات التالية:
:effect_free
:nothrow
:terminates_globally
:total
تعتبر هذه الإعدادات أقصى مجموعة ممكنة من التأثيرات. وهي حاليًا تعني الإعدادات الأخرى التالية:
:consistent
:effect_free
:nothrow
:terminates_globally
:notaskstate
:inaccessiblememonly
:noub
:nortcall
:total
هو تأكيد قوي جدًا ومن المحتمل أن يكتسب دلالات إضافية في الإصدارات المستقبلية من جوليا (على سبيل المثال، إذا تمت إضافة تأثيرات إضافية وتم تضمينها في تعريف :total
). نتيجة لذلك، يجب استخدامه بحذر. كلما كان ذلك ممكنًا، يُفضل استخدام الحد الأدنى الممكن من مجموعة تأكيدات التأثير المحددة المطلوبة لتطبيق معين. في الحالات التي تنطبق فيها عدد كبير من تجاوزات التأثير على مجموعة من الدوال، يُوصى باستخدام ماكرو مخصص بدلاً من استخدام :total
.
التأثيرات المنفية
يمكن أن يتم تمييز أسماء التأثيرات بواسطة !
للإشارة إلى أن التأثير يجب أن يتم إزالته من تأثير ميتا سابق. على سبيل المثال، :total !:nothrow
تشير إلى أنه بينما يكون الاستدعاء بشكل عام كليًا، إلا أنه قد يلقي استثناء.
Managing deprecations
Base.@deprecate
— Macro@deprecate old new [export_old=true]
قم بإلغاء استخدام الطريقة old
وحدد استدعاء الاستبدال new
، مع تعريف طريقة جديدة old
بالتوقيع المحدد في هذه العملية.
لمنع تصدير old
، قم بتعيين export_old
إلى false
.
انظر أيضًا Base.depwarn()
.
اعتبارًا من Julia 1.5، فإن الدوال المعرفة بواسطة @deprecate
لا تطبع تحذيرًا عند تشغيل julia
بدون تعيين علامة --depwarn=yes
، حيث أن القيمة الافتراضية لخيار --depwarn
هي no
. يتم طباعة التحذيرات من الاختبارات التي يتم تشغيلها بواسطة Pkg.test()
.
أمثلة
julia> @deprecate old(x) new(x)
old (generic function with 1 method)
julia> @deprecate old(x) new(x) false
old (generic function with 1 method)
ستحدد الاستدعاءات إلى @deprecate
بدون توضيحات نوع صريحة طرقًا ملغاة تقبل أي عدد من الوسائط الموضعية ووسائط الكلمات الرئيسية من النوع Any
.
يتم تمرير وسائط الكلمات الرئيسية عندما لا توجد توضيحات نوع صريحة اعتبارًا من Julia 1.9. بالنسبة للإصدارات الأقدم، يمكنك تمرير الوسائط الموضعية ووسائط الكلمات الرئيسية يدويًا عن طريق القيام بـ @deprecate old(args...; kwargs...) new(args...; kwargs...)
.
لتقييد إلغاء الاستخدام لتوقيع محدد، قم بتعليق الوسائط الخاصة بـ old
. على سبيل المثال،
julia> new(x::Int) = x;
julia> new(x::Float64) = 2x;
julia> @deprecate old(x::Int) new(x);
julia> methods(old)
# 1 method for generic function "old" from Main:
[1] old(x::Int64)
@ deprecated.jl:94
سيحدد ويُلغي استخدام طريقة old(x::Int)
التي تعكس new(x::Int)
ولكن لن يُعرّف أو يُلغي استخدام الطريقة old(x::Float64)
.
Base.depwarn
— FunctionBase.depwarn(msg::String, funcsym::Symbol; force=false)
اطبع msg
كتحذير من الإهمال. يجب أن يكون الرمز funcsym
هو اسم الدالة المستدعاة، والتي تُستخدم لضمان أن تحذير الإهمال يتم طباعته فقط في المرة الأولى لكل مكان استدعاء. قم بتعيين force=true
لفرض عرض التحذير دائمًا، حتى لو تم بدء جوليا مع --depwarn=no
(الإعداد الافتراضي).
انظر أيضًا @deprecate
.
أمثلة
function deprecated_func()
Base.depwarn("لا تستخدم `deprecated_func()`!", :deprecated_func)
1 + 1
end
Missing Values
Base.Missing
— Typeمفقود
نوع بلا حقول يتم استخدام مثيله الفردي missing
لتمثيل القيم المفقودة.
انظر أيضًا: skipmissing
، nonmissingtype
، Nothing
.
Base.missing
— ConstantBase.coalesce
— Functioncoalesce(x...)
ارجع أول قيمة في المعطيات التي لا تساوي missing
، إذا وُجدت. وإلا ارجع missing
.
انظر أيضًا skipmissing
، something
، @coalesce
.
أمثلة
julia> coalesce(missing, 1)
1
julia> coalesce(1, missing)
1
julia> coalesce(nothing, 1) # يرجع `nothing`
julia> coalesce(missing, missing)
missing
Base.@coalesce
— Macro@coalesce(x...)
نسخة قصيرة من coalesce
.
أمثلة
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
[...]
هذه الماكرو متاحة اعتبارًا من Julia 1.7.
Base.ismissing
— FunctionBase.skipmissing
— Functionskipmissing(itr)
إرجاع مُكرّر على العناصر في itr
متجاوزًا قيم missing
. يمكن فهرسة الكائن المُرجع باستخدام مؤشرات itr
إذا كان الأخير قابلًا للفهرسة. المؤشرات التي تتوافق مع القيم المفقودة غير صالحة: يتم تخطيها بواسطة keys
وeachindex
، ويتم إلقاء استثناء MissingException
عند محاولة استخدامها.
استخدم collect
للحصول على Array
تحتوي على القيم غير المفقودة في itr
. لاحظ أنه حتى إذا كانت itr
مصفوفة متعددة الأبعاد، فإن النتيجة ستكون دائمًا Vector
لأنه لا يمكن إزالة القيم المفقودة مع الحفاظ على أبعاد الإدخال.
انظر أيضًا coalesce
، ismissing
، something
.
أمثلة
julia> x = skipmissing([1, missing, 2])
skipmissing(Union{Missing, Int64}[1, missing, 2])
julia> sum(x)
3
julia> x[1]
1
julia> x[2]
ERROR: MissingException: the value at index (2,) is missing
[...]
julia> argmax(x)
3
julia> collect(keys(x))
2-element Vector{Int64}:
1
3
julia> collect(skipmissing([1, missing, 2]))
2-element Vector{Int64}:
1
2
julia> collect(skipmissing([1 missing; 2 missing]))
2-element Vector{Int64}:
1
2
Base.nonmissingtype
— Functionnonmissingtype(T::Type)
إذا كان T
هو اتحاد من الأنواع يحتوي على Missing
، قم بإرجاع نوع جديد مع إزالة Missing
.
أمثلة
julia> nonmissingtype(Union{Int64,Missing})
Int64
julia> nonmissingtype(Any)
Any
تم تصدير هذه الدالة اعتبارًا من Julia 1.3.
System
Base.run
— Functionrun(command, args...; wait::Bool = true)
قم بتشغيل كائن الأمر، الذي تم إنشاؤه باستخدام الأقواس المعكوسة (انظر قسم تشغيل البرامج الخارجية في الدليل). يتم إلقاء خطأ إذا حدث أي شيء خاطئ، بما في ذلك خروج العملية بحالة غير صفرية (عندما يكون wait
صحيحًا).
تسمح لك args...
بتمرير موصّلات الملفات إلى الأمر، وهي مرتبة مثل موصّلات الملفات العادية في يونكس (مثل stdin, stdout, stderr, FD(3), FD(4)...
).
إذا كان wait
خاطئًا، فإن العملية تعمل بشكل غير متزامن. يمكنك لاحقًا الانتظار لها والتحقق من حالة خروجها عن طريق استدعاء success
على كائن العملية المعاد.
عندما يكون wait
خاطئًا، يتم توجيه تدفقات الإدخال/الإخراج للعملية إلى devnull
. عندما يكون wait
صحيحًا، يتم مشاركة تدفقات الإدخال/الإخراج مع العملية الأصلية. استخدم pipeline
للتحكم في إعادة توجيه الإدخال/الإخراج.
Base.devnull
— Constantdevnull
يستخدم في إعادة توجيه التدفق للتخلص من جميع البيانات المكتوبة إليه. يعادل بشكل أساسي /dev/null
على أنظمة Unix أو NUL
على Windows. الاستخدام:
run(pipeline(`cat test.txt`, devnull))
Base.success
— Functionsuccess(command)
قم بتشغيل كائن الأمر، الذي تم إنشاؤه باستخدام الأقواس المعكوسة (انظر قسم تشغيل البرامج الخارجية في الدليل)، وأخبر ما إذا كان ناجحًا (انتهى برمز 0). يتم رفع استثناء إذا لم يكن من الممكن بدء العملية.
Base.process_running
— Functionprocess_running(p::Process)
تحديد ما إذا كانت العملية تعمل حاليًا.
Base.process_exited
— Functionprocess_exited(p::Process)
تحديد ما إذا كانت العملية قد انتهت.
Base.kill
— Methodkill(p::Process, signum=Base.SIGTERM)
أرسل إشارة إلى عملية. القيمة الافتراضية هي إنهاء العملية. يتم إرجاع النتيجة بنجاح إذا كانت العملية قد انتهت بالفعل، ولكن يتم إلقاء خطأ إذا فشل إنهاء العملية لأسباب أخرى (مثل عدم كفاية الأذونات).
Base.Sys.set_process_title
— FunctionSys.set_process_title(title::AbstractString)
قم بتعيين عنوان العملية. لا تفعل شيئًا على بعض أنظمة التشغيل.
Base.Sys.get_process_title
— FunctionSys.get_process_title()
احصل على عنوان العملية. في بعض الأنظمة، سيعيد دائمًا سلسلة فارغة.
Base.ignorestatus
— Functionignorestatus(command)
قم بتمييز كائن الأمر بحيث لا يؤدي تشغيله إلى حدوث خطأ إذا كانت قيمة نتيجة الكود غير صفرية.
Base.detach
— Functiondetach(command)
قم بتمييز كائن الأمر بحيث يتم تشغيله في مجموعة عمليات جديدة، مما يسمح له بالاستمرار بعد عملية جوليا، وعدم تمرير مقاطعات Ctrl-C إليه.
Base.Cmd
— TypeCmd(cmd::Cmd; ignorestatus, detach, windows_verbatim, windows_hide, env, dir)
Cmd(exec::Vector{String})
قم بإنشاء كائن Cmd
جديد، يمثل برنامجًا خارجيًا وحججه، من cmd
، مع تغيير إعدادات الوسائط الاختيارية:
ignorestatus::Bool
: إذا كانتtrue
(افتراضيًاfalse
)، فلن يقومCmd
بإلقاء خطأ إذا كانت قيمة الإرجاع غير صفر.detach::Bool
: إذا كانتtrue
(افتراضيًاfalse
)، فسيتم تشغيلCmd
في مجموعة عمليات جديدة، مما يسمح له بالاستمرار في الحياة بعد عمليةjulia
وعدم تمرير Ctrl-C إليه.windows_verbatim::Bool
: إذا كانتtrue
(افتراضيًاfalse
)، فإنCmd
على نظام Windows سيرسل سلسلة سطر الأوامر إلى العملية دون اقتباس أو هروب للحجج، حتى الحجج التي تحتوي على مسافات. (على نظام Windows، يتم إرسال الحجج إلى البرنامج كسلسلة "سطر أوامر" واحدة، والبرامج مسؤولة عن تحليلها إلى حجج. بشكل افتراضي، يتم اقتباس الحجج الفارغة والحجج التي تحتوي على مسافات أو علامات تبويب بعلامات اقتباس مزدوجة"
في سطر الأوامر، و\
أو"
يتم تقديمها بواسطة شرائح خلفية.windows_verbatim=true
مفيد لتشغيل البرامج التي تحلل سطر الأوامر الخاص بها بطرق غير قياسية.) ليس له تأثير على الأنظمة غير العاملة بنظام Windows.windows_hide::Bool
: إذا كانتtrue
(افتراضيًاfalse
)، فلن يتم عرض نافذة وحدة تحكم جديدة عند تنفيذCmd
على نظام Windows. ليس له تأثير إذا كانت وحدة تحكم مفتوحة بالفعل أو على الأنظمة غير العاملة بنظام Windows.env
: تعيين متغيرات البيئة لاستخدامها عند تشغيلCmd
.env
هو إما قاموس يربط السلاسل بالسلاسل، أو مصفوفة من السلاسل على شكل"var=val"
، أو مصفوفة أو مجموعة من أزواج"var"=>val
. لتعديل (بدلاً من استبدال) البيئة الحالية، قم بتهيئةenv
باستخدامcopy(ENV)
ثم قم بتعيينenv["var"]=val
حسب الرغبة. لإضافة إلى كتلة البيئة داخل كائنCmd
دون استبدال جميع العناصر، استخدمaddenv()
الذي سيعيد كائنCmd
مع البيئة المحدثة.dir::AbstractString
: تحديد دليل عمل للأمر (بدلاً من الدليل الحالي).
بالنسبة لأي كلمات رئيسية لم يتم تحديدها، يتم استخدام الإعدادات الحالية من cmd
.
لاحظ أن مُنشئ Cmd(exec)
لا ينشئ نسخة من exec
. ستنعكس أي تغييرات لاحقة على exec
في كائن Cmd
.
أكثر الطرق شيوعًا لإنشاء كائن Cmd
هي باستخدام الحروف الأمرية (علامات الاقتباس العكسية)، على سبيل المثال:
`ls -l`
يمكن بعد ذلك تمرير هذا إلى مُنشئ Cmd
لتعديل إعداداته، على سبيل المثال:
Cmd(`echo "Hello world"`, ignorestatus=true, detach=false)
Base.setenv
— Functionsetenv(command::Cmd, env; dir)
قم بتعيين متغيرات البيئة لاستخدامها عند تشغيل الأمر المعطى command
. env
إما أن يكون قاموسًا يربط السلاسل بسلاسل، أو مصفوفة من السلاسل بالشكل "var=val"
، أو صفر أو أكثر من أزواج المعاملات "var"=>val
. من أجل تعديل (بدلاً من استبدال) البيئة الحالية، قم بإنشاء env
من خلال copy(ENV)
ثم تعيين env["var"]=val
كما هو مطلوب، أو استخدم addenv
.
يمكن استخدام معامل الكلمة الرئيسية dir
لتحديد دليل العمل للأمر. dir
افتراضيًا هو dir
المحدد حاليًا لـ command
(وهو دليل العمل الحالي إذا لم يتم تحديده بالفعل).
Base.addenv
— Functionaddenv(command::Cmd, env...; inherit::Bool = true)
ادمج خرائط البيئة الجديدة في كائن Cmd
المعطى، مع إرجاع كائن Cmd
جديد. يتم استبدال المفاتيح المكررة. إذا لم يحتوي command
على أي قيم بيئية تم تعيينها مسبقًا، فإنه يرث البيئة الحالية في وقت استدعاء addenv()
إذا كان inherit
هو true
. يتم حذف المفاتيح التي تحتوي على قيمة nothing
من البيئة.
تتطلب هذه الوظيفة Julia 1.6 أو أحدث.
Base.withenv
— Functionwithenv(f, kv::Pair...)
نفذ f
في بيئة تم تعديلها مؤقتًا (وليس استبدالها كما في setenv
) بواسطة صفر أو أكثر من الوسائط "var"=>val
kv
. يتم استخدام withenv
عمومًا عبر بناء الجملة withenv(kv...) do ... end
. يمكن استخدام قيمة nothing
لإلغاء تعيين متغير بيئي مؤقتًا (إذا كان مضبوطًا). عند عودة withenv
، تم استعادة البيئة الأصلية.
!!! تحذير تغيير البيئة ليس آمنًا في الخيوط. لتشغيل الأوامر الخارجية ببيئة مختلفة عن عملية الوالد، يُفضل استخدام addenv
بدلاً من withenv
.
Base.setcpuaffinity
— Functionsetcpuaffinity(original_command::Cmd, cpus) -> command::Cmd
قم بتعيين تفضيل وحدة المعالجة المركزية لـ command
بواسطة قائمة من معرفات وحدة المعالجة المركزية (1-based) cpus
. يعني تمرير cpus = nothing
إلغاء تعيين تفضيل وحدة المعالجة المركزية إذا كان لدى original_command
أي منها.
تدعم هذه الوظيفة فقط في Linux و Windows. لا يتم دعمها في macOS لأن libuv لا يدعم تعيين التفضيل.
تتطلب هذه الوظيفة على الأقل Julia 1.8.
أمثلة
في Linux، يمكن استخدام برنامج سطر الأوامر taskset
لرؤية كيفية عمل setcpuaffinity
.
julia> run(setcpuaffinity(`sh -c 'taskset -p $$'`, [1, 2, 5]));
pid 2273's current affinity mask: 13
لاحظ أن قيمة القناع 13
تعكس أن البتات الأولى والثانية والخامسة (بالعد من الموضع الأقل أهمية) مضاءة:
julia> 0b010011
0x13
Base.pipeline
— Methodpipeline(from, to, ...)
أنشئ خط أنابيب من مصدر بيانات إلى وجهة. يمكن أن تكون المصدر والوجهة أوامر، تدفقات إدخال/إخراج، سلاسل نصية، أو نتائج استدعاءات أخرى لـ pipeline
. يجب أن يكون هناك على الأقل وسيط واحد هو أمر. تشير السلاسل النصية إلى أسماء الملفات. عند استدعائها بأكثر من وسيطين، يتم ربطها معًا من اليسار إلى اليمين. على سبيل المثال، pipeline(a,b,c)
يعادل pipeline(pipeline(a,b),c)
. يوفر هذا طريقة أكثر اختصارًا لتحديد خطوط أنابيب متعددة المراحل.
أمثلة:
run(pipeline(`ls`, `grep xyz`))
run(pipeline(`ls`, "out.txt"))
run(pipeline("out.txt", `grep xyz`))
Base.pipeline
— Methodpipeline(command; stdin, stdout, stderr, append=false)
إعادة توجيه الإدخال/الإخراج إلى أو من command
المعطى. تحدد الوسائط الرئيسية أي من تدفقات الأمر يجب إعادة توجيهها. يتحكم append
في ما إذا كان إخراج الملف يضاف إلى الملف. هذه نسخة أكثر عمومية من دالة pipeline
ذات الوسيطين. pipeline(from, to)
تعادل pipeline(from, stdout=to)
عندما يكون from
أمرًا، و pipeline(to, stdin=from)
عندما يكون from
نوعًا آخر من مصادر البيانات.
أمثلة:
run(pipeline(`dothings`, stdout="out.txt", stderr="errs.txt"))
run(pipeline(`update`, stdout="log.txt", append=true))
Base.Libc.gethostname
— Functiongethostname() -> String
احصل على اسم المضيف لجهاز الكمبيوتر المحلي.
Base.Libc.getpid
— Functiongetpid() -> Int32
احصل على معرف عملية جوليا.
getpid(process) -> Int32
احصل على معرف عملية الطفل، إذا كانت لا تزال موجودة.
تتطلب هذه الوظيفة على الأقل جوليا 1.1.
Base.Libc.time
— Methodtime() -> Float64
احصل على وقت النظام بالثواني منذ العصر، بدقة عالية (عادةً، ميكروثانية).
Base.time_ns
— Functiontime_ns() -> UInt64
احصل على الوقت بالنانوثانية. الوقت المقابل لـ 0 غير محدد، ويتكرر كل 5.8 سنوات.
Base.@time
— Macro@time expr
@time "description" expr
ماكرو لتنفيذ تعبير، يطبع الوقت الذي استغرقه للتنفيذ، عدد التخصيصات، وإجمالي عدد البايتات التي تم تخصيصها نتيجة لتنفيذه، قبل إرجاع قيمة التعبير. أي وقت تم قضاؤه في جمع القمامة (gc)، تجميع كود جديد، أو إعادة تجميع كود تم إبطال صلاحيته يظهر كنسبة مئوية. أي تعارضات في القفل حيث كان يجب على ReentrantLock
الانتظار تظهر كعدد.
يمكنك اختيارياً تقديم سلسلة وصفية للطباعة قبل تقرير الوقت.
في بعض الحالات، ستنظر النظام داخل تعبير @time
وتجمع بعض الكود المستدعى قبل بدء تنفيذ التعبير على المستوى الأعلى. عندما يحدث ذلك، لن يتم احتساب بعض وقت التجميع. لتضمين هذا الوقت يمكنك تشغيل @time @eval ...
.
انظر أيضًا @showtime
، @timev
، @timed
، @elapsed
، @allocated
، و @allocations
.
!!! ملاحظة من أجل قياس الأداء بشكل أكثر جدية، ضع في اعتبارك ماكرو @btime
من حزمة BenchmarkTools.jl التي تقيم الوظيفة عدة مرات من أجل تقليل الضوضاء.
!!! توافق "جوليا 1.8" تم تقديم خيار إضافة وصف في جوليا 1.8.
تم تقديم وقت إعادة التجميع الذي يظهر بشكل منفصل عن وقت التجميع في جوليا 1.8.
!!! توافق "جوليا 1.11" تم إضافة تقرير أي تعارضات في القفل في جوليا 1.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)
Base.@showtime
— Macro@showtime expr
مثل @time
ولكنه يطبع أيضًا التعبير الذي يتم تقييمه للرجوع إليه.
تم إضافة هذه الماكرو في جوليا 1.8.
انظر أيضًا @time
.
julia> @showtime sleep(1)
sleep(1): 1.002164 seconds (4 allocations: 128 bytes)
Base.@timev
— Macro@timev expr
@timev "description" expr
هذه نسخة مفصلة من ماكرو @time
. أولاً، تطبع نفس المعلومات مثل @time
، ثم أي عدادات تخص تخصيص الذاكرة غير الصفرية، ثم تعيد قيمة التعبير.
يمكنك اختيارياً تقديم سلسلة وصف لطباعة قبل تقرير الوقت.
تم تقديم خيار إضافة وصف في Julia 1.8.
انظر أيضًا @time
، @timed
، @elapsed
، @allocated
، و@allocations
.
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
Base.@timed
— Macro@timed
ماكرو لتنفيذ تعبير، وإرجاع قيمة التعبير، ووقت التنفيذ بالثواني، وإجمالي البايتات المخصصة، ووقت جمع القمامة، وكائن يحتوي على عدادات تخصيص الذاكرة المختلفة، ووقت التجميع بالثواني، ووقت إعادة التجميع بالثواني. أي تعارضات في القفل حيث كان يجب على ReentrantLock
الانتظار تظهر كعدد.
في بعض الحالات، ستنظر النظام داخل تعبير @timed
وتجمع بعض الشيفرات المستدعاة قبل بدء تنفيذ التعبير على المستوى الأعلى. عندما يحدث ذلك، لن يتم احتساب بعض وقت التجميع. لتضمين هذا الوقت يمكنك تشغيل @timed @eval ...
.
انظر أيضًا @time
، @timev
، @elapsed
، @allocated
، @allocations
، و@lock_conflicts
.
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
تم تغيير نوع الإرجاع لهذا الماكرو من Tuple
إلى NamedTuple
في Julia 1.5.
تم إضافة حقول lock_conflicts
و compile_time
و recompile_time
في Julia 1.11.
Base.@elapsed
— Macro@elapsed
ماكرو لتقييم تعبير، متجاهلاً القيمة الناتجة، بدلاً من ذلك يعيد عدد الثواني التي استغرقتها التنفيذ كعدد عشري.
في بعض الحالات، سينظر النظام داخل تعبير @elapsed
ويقوم بتجميع بعض الشيفرات المستدعاة قبل بدء تنفيذ التعبير على المستوى الأعلى. عندما يحدث ذلك، لن يتم احتساب بعض وقت التجميع. لتضمين هذا الوقت يمكنك تشغيل @elapsed @eval ...
.
انظر أيضًا @time
، @timev
، @timed
، @allocated
، و @allocations
.
julia> @elapsed sleep(0.3)
0.301391426
Base.@allocated
— Macro@allocated
ماكرو لتقييم تعبير، متجاهلاً القيمة الناتجة، بدلاً من ذلك إرجاع العدد الإجمالي للبايتات المخصصة أثناء تقييم التعبير.
انظر أيضًا @allocations
، @time
، @timev
، @timed
، و@elapsed
.
julia> @allocated rand(10^6)
8000080
Base.@allocations
— Macro@allocations
ماكرو لتقييم تعبير، والتخلص من القيمة الناتجة، وبدلاً من ذلك إرجاع العدد الإجمالي للتخصيصات أثناء تقييم التعبير.
انظر أيضًا @allocated
، @time
، @timev
، @timed
، و@elapsed
.
julia> @allocations rand(10^6)
2
تمت إضافة هذا الماكرو في Julia 1.9.
Base.@lock_conflicts
— Macro@lock_conflicts
ماكرو لتقييم تعبير، والتخلص من القيمة الناتجة، وبدلاً من ذلك إرجاع العدد الإجمالي لعمليات قفل الانتظار أثناء التقييم، حيث أدى محاولة القفل على ReentrantLock
إلى الانتظار لأن القفل كان محجوزًا بالفعل.
انظر أيضًا @time
، @timev
و @timed
.
julia> @lock_conflicts begin
l = ReentrantLock()
Threads.@threads for i in 1:Threads.nthreads()
lock(l) do
sleep(1)
end
end
end
5
تمت إضافة هذا الماكرو في Julia 1.11.
Base.EnvDict
— TypeEnvDict() -> EnvDict
يوفر كائن مفرد من هذا النوع واجهة جدول تجزئة لمتغيرات البيئة.
Base.ENV
— ConstantENV
إشارة إلى الكائن الفردي EnvDict
، الذي يوفر واجهة قاموس لمتغيرات بيئة النظام.
(على نظام ويندوز، متغيرات بيئة النظام غير حساسة لحالة الأحرف، و 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"
Base.Sys.STDLIB
— ConstantSys.STDLIB::String
سلسلة تحتوي على المسار الكامل إلى الدليل الذي يحتوي على حزم stdlib
.
Base.Sys.isunix
— FunctionSys.isunix([os])
عبارة لاختبار ما إذا كان نظام التشغيل يوفر واجهة شبيهة بـ Unix. راجع الوثائق في Handling Operating System Variation.
Base.Sys.isapple
— FunctionSys.isapple([os])
عبارة لاختبار ما إذا كان نظام التشغيل هو مشتق من نظام تشغيل أبل ماكنتوش OS X أو داروين. راجع الوثائق في Handling Operating System Variation.
Base.Sys.islinux
— FunctionSys.islinux([os])
عبارة لاختبار ما إذا كان نظام التشغيل مشتقًا من لينكس. راجع الوثائق في التعامل مع اختلافات نظام التشغيل.
Base.Sys.isbsd
— FunctionSys.isbsd([os])
عبارة لاختبار ما إذا كان نظام التشغيل مشتقًا من BSD. راجع الوثائق في التعامل مع اختلافات نظام التشغيل.
!!! ملاحظة نواة داروين تنحدر من BSD، مما يعني أن Sys.isbsd()
تكون true
على أنظمة macOS. لاستبعاد macOS من العبارة، استخدم Sys.isbsd() && !Sys.isapple()
.
Base.Sys.isfreebsd
— FunctionSys.isfreebsd([os])
عبارة لاختبار ما إذا كان نظام التشغيل مشتقًا من FreeBSD. راجع الوثائق في Handling Operating System Variation.
!!! ملاحظة لا ينبغي الخلط بينه وبين Sys.isbsd()
، الذي يكون true
على FreeBSD ولكن أيضًا على أنظمة BSD الأخرى. تشير Sys.isfreebsd()
فقط إلى FreeBSD.
!!! توافق "جوليا 1.1" تتطلب هذه الوظيفة على الأقل جوليا 1.1.
Base.Sys.isopenbsd
— FunctionSys.isopenbsd([os])
دالة لاختبار ما إذا كان نظام التشغيل مشتقًا من OpenBSD. راجع الوثائق في Handling Operating System Variation.
!!! ملاحظة لا تخلط بين Sys.isbsd()
، التي تكون true
على OpenBSD ولكن أيضًا على أنظمة BSD الأخرى. تشير Sys.isopenbsd()
فقط إلى OpenBSD.
!!! توافق "جوليا 1.1" تتطلب هذه الدالة على الأقل جوليا 1.1.
Base.Sys.isnetbsd
— FunctionSys.isnetbsd([os])
دالة لاختبار ما إذا كان نظام التشغيل مشتقًا من NetBSD. راجع الوثائق في Handling Operating System Variation.
!!! ملاحظة لا تخلط بين Sys.isbsd()
، التي تكون true
على NetBSD ولكن أيضًا على أنظمة BSD الأخرى. تشير Sys.isnetbsd()
فقط إلى NetBSD.
!!! توافق "جوليا 1.1" تتطلب هذه الدالة على الأقل جوليا 1.1.
Base.Sys.isdragonfly
— FunctionSys.isdragonfly([os])
عبارة لاختبار ما إذا كان نظام التشغيل هو مشتق من DragonFly BSD. راجع الوثائق في Handling Operating System Variation.
!!! ملاحظة لا تخلط بينه وبين Sys.isbsd()
، الذي يكون true
على DragonFly ولكن أيضًا على أنظمة أخرى قائمة على BSD. تشير Sys.isdragonfly()
فقط إلى DragonFly.
!!! توافق "جوليا 1.1" تتطلب هذه الوظيفة على الأقل جوليا 1.1.
Base.Sys.iswindows
— FunctionSys.iswindows([os])
عبارة لاختبار ما إذا كان نظام التشغيل مشتقًا من Microsoft Windows NT. راجع الوثائق في Handling Operating System Variation.
Base.Sys.windows_version
— FunctionSys.windows_version()
إرجاع رقم الإصدار لنواة Windows NT كـ VersionNumber
، أي v"major.minor.build"
، أو v"0.0.0"
إذا لم يكن هذا يعمل على Windows.
Base.Sys.free_memory
— FunctionSys.free_memory()
احصل على إجمالي الذاكرة الحرة في RAM بالبايت.
Base.Sys.total_memory
— FunctionSys.total_memory()
احصل على إجمالي الذاكرة في RAM (بما في ذلك ما هو مستخدم حاليًا) بالبايت. قد يكون هذا المبلغ مقيدًا، على سبيل المثال، بواسطة مجموعات التحكم في Linux. للحصول على المبلغ غير المقيد، انظر Sys.total_physical_memory()
.
Base.Sys.free_physical_memory
— FunctionSys.free_physical_memory()
احصل على الذاكرة الحرة للنظام بالبايت. قد لا تكون الكمية الكاملة متاحة للعملية الحالية؛ استخدم Sys.free_memory()
للكمية المتاحة فعليًا.
Base.Sys.total_physical_memory
— FunctionSys.total_physical_memory()
احصل على إجمالي الذاكرة في RAM (بما في ذلك ما هو مستخدم حاليًا) بالبايت. قد لا تكون الكمية الكاملة متاحة للعملية الحالية؛ انظر Sys.total_memory()
.
Base.Sys.uptime
— FunctionSys.uptime()
يحصل على وقت تشغيل النظام الحالي بالثواني.
Base.Sys.isjsvm
— FunctionSys.isjsvm([os])
عبارة لاختبار ما إذا كانت جوليا تعمل في بيئة JavaScript VM (JSVM)، بما في ذلك على سبيل المثال، تضمين JavaScript WebAssembly في متصفح الويب.
تتطلب هذه الوظيفة على الأقل جوليا 1.2.
Base.Sys.loadavg
— FunctionSys.loadavg()
احصل على متوسط الحمل. انظر: https://en.wikipedia.org/wiki/Load_(computing).
Base.Sys.isexecutable
— Functionisexecutable(path::String)
ارجع true
إذا كان path
المعطى لديه أذونات تنفيذ.
!!! ملاحظة قد تتغير هذه الإذن قبل أن ينفذ المستخدم path
، لذا يُوصى بتنفيذ الملف ومعالجة الخطأ إذا فشل ذلك، بدلاً من استدعاء isexecutable
أولاً.
!!! ملاحظة قبل Julia 1.6، لم يكن هذا يستجوب ACLs نظام الملفات بشكل صحيح على Windows، لذلك كان سيعيد true
لأي ملف. بدءًا من Julia 1.6، يحدد بشكل صحيح ما إذا كان الملف مُعَلَّمًا كتنفيذي أم لا.
انظر أيضًا ispath
، isreadable
، iswritable
.
Base.Sys.isreadable
— Functionisreadable(path::String)
ارجع true
إذا كانت أذونات الوصول للمسار المعطى تسمح بالقراءة من قبل المستخدم الحالي.
قد تتغير هذه الإذن قبل أن يستدعي المستخدم open
، لذا يُوصى باستدعاء open
بمفرده ومعالجة الخطأ إذا فشل ذلك، بدلاً من استدعاء isreadable
أولاً.
حالياً، لا تستجوب هذه الدالة ACLs نظام الملفات بشكل صحيح على Windows، لذلك قد تعيد نتائج خاطئة.
تتطلب هذه الدالة على الأقل Julia 1.11.
انظر أيضًا ispath
، isexecutable
، iswritable
.
isreadable(io) -> Bool
ارجع false
إذا كان كائن 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")
Base.Sys.iswritable
— Functioniswritable(path::String)
إرجاع true
إذا كانت أذونات الوصول للمسار المعطى تسمح بالكتابة من قبل المستخدم الحالي.
!!! ملاحظة قد تتغير هذه الإذن قبل أن يستدعي المستخدم open
، لذا يُوصى باستدعاء open
بمفرده ومعالجة الخطأ إذا فشل ذلك، بدلاً من استدعاء iswritable
أولاً.
!!! ملاحظة حالياً، لا تستجوب هذه الدالة ACLs نظام الملفات بشكل صحيح على Windows، لذلك قد تعيد نتائج خاطئة.
!!! توافق "جوليا 1.11" تتطلب هذه الدالة على الأقل جوليا 1.11.
انظر أيضًا ispath
، isexecutable
، isreadable
.
iswritable(io) -> Bool
ارجع false
إذا كان كائن 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")
Base.Sys.username
— FunctionSys.username() -> String
ارجع اسم المستخدم الحالي. إذا لم يمكن تحديد اسم المستخدم أو كان فارغًا، فإن هذه الدالة ترمي خطأ.
لاسترجاع اسم مستخدم يمكن تجاوزه عبر متغير بيئة، مثل USER
، يُفضل استخدام
user = get(Sys.username, ENV, "USER")
هذه الدالة تتطلب على الأقل Julia 1.11.
انظر أيضًا homedir
.
Base.@static
— Macro@static
قم بتقييم تعبير جزئيًا في وقت التحليل.
على سبيل المثال، @static Sys.iswindows() ? foo : bar
سيقوم بتقييم Sys.iswindows()
وإدراج إما foo
أو bar
في التعبير. هذا مفيد في الحالات التي سيكون فيها البناء غير صالح على منصات أخرى، مثل ccall
إلى دالة غير موجودة. @static if Sys.isapple() foo end
و @static foo <&&,||> bar
هما أيضًا بناء صحيح.
Versioning
Base.VersionNumber
— Typeرقم الإصدار
نوع رقم الإصدار الذي يتبع مواصفات الإصدار الدلالي (semver)، ويتكون من قيم عددية رئيسية وصغرى وتصحيح، تليها تعليقات توضيحية أبجدية رقمية للإصدار المسبق والبناء.
يمكن مقارنة كائنات VersionNumber
مع جميع عوامل المقارنة القياسية (==
، <
، <=
، إلخ)، مع اتباع النتيجة لقواعد semver.
يمتلك VersionNumber
الحقول العامة التالية:
v.major::Integer
v.minor::Integer
v.patch::Integer
v.prerelease::Tuple{Vararg{Union{Integer, AbstractString}}}
v.build::Tuple{Vararg{Union{Integer, AbstractString}}}
انظر أيضًا @v_str
لبناء كائنات VersionNumber
بكفاءة من سلاسل نصية بتنسيق semver، وVERSION
لرقم الإصدار الخاص بـ Julia، والأدلة الخاصة برقم الإصدار في الدليل.
أمثلة
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
Base.@v_str
— Macro@v_str
ماكرو السلسلة المستخدم لتحليل سلسلة إلى VersionNumber
.
أمثلة
julia> v"1.2.3"
v"1.2.3"
julia> v"2.0.1-rc1"
v"2.0.1-rc1"
Errors
Base.error
— Functionerror(message::AbstractString)
رفع ErrorException
مع الرسالة المعطاة.
error(msg...)
رفع ErrorException
برسالة تم إنشاؤها بواسطة string(msg...)
.
Core.throw
— FunctionBase.rethrow
— Functionrethrow()
إعادة رمي الاستثناء الحالي من داخل كتلة catch
. سيستمر الاستثناء المعاد رميه في الانتشار كما لو لم يتم التقاطه.
!!! ملاحظة الشكل البديل rethrow(e)
يتيح لك ربط كائن استثناء بديل e
مع تتبع الأخطاء الحالي. ومع ذلك، فإن هذا يسيء تمثيل حالة البرنامج في وقت الخطأ، لذا يُشجع على بدلاً من ذلك رمي استثناء جديد باستخدام throw(e)
. في جوليا 1.1 وما فوق، سيحافظ استخدام throw(e)
على استثناء السبب الجذري في المكدس، كما هو موضح في current_exceptions
.
Base.backtrace
— Functionbacktrace()
احصل على كائن تتبع للخلف لنقطة البرنامج الحالية.
Base.catch_backtrace
— Functioncatch_backtrace()
احصل على تتبع الأخطاء للاستثناء الحالي، للاستخدام داخل كتل catch
.
Base.current_exceptions
— Functioncurrent_exceptions(task::Task=current_task(); [backtrace::Bool=true])
احصل على مكدس الاستثناءات التي يتم التعامل معها حاليًا. بالنسبة لكتل catch المتداخلة، قد يكون هناك أكثر من استثناء حالي واحد، وفي هذه الحالة يكون الاستثناء الذي تم طرحه مؤخرًا هو الأخير في المكدس. يتم إرجاع المكدس كـ ExceptionStack
، وهو عبارة عن AbstractVector من التوائم المسماة (exception,backtrace)
. إذا كان backtrace
غير صحيح، فسيتم تعيين تتبع الاستثناء في كل زوج إلى nothing
.
سوف يؤدي تمرير task
بشكل صريح إلى إرجاع مكدس الاستثناءات الحالي على مهمة عشوائية. هذا مفيد لفحص المهام التي فشلت بسبب استثناءات غير معالجة.
كانت هذه الوظيفة تُعرف بالاسم التجريبي catch_stack()
في Julia 1.1–1.6، وكان لها نوع إرجاع بسيط من Vector-of-tuples.
Base.@assert
— Macro@assert cond [text]
ارمِ AssertionError
إذا كانت cond
false
. هذه هي الصيغة المفضلة لكتابة التأكيدات، وهي شروط يُفترض أن تكون صحيحة، ولكن قد يقرر المستخدم التحقق منها على أي حال، كوسيلة للمساعدة في تصحيح الأخطاء إذا فشلت. يتم عرض الرسالة الاختيارية text
عند فشل التأكيد.
!!! تحذير قد يتم تعطيل التأكيد عند بعض مستويات التحسين. يجب استخدام التأكيد كأداة تصحيح فقط وليس للتحقق من المصادقة (مثل، التحقق من كلمات المرور أو التحقق من حدود المصفوفات). يجب ألا يعتمد الكود على الآثار الجانبية لتشغيل cond
للسلوك الصحيح للدالة.
أمثلة
julia> @assert iseven(3) "3 is an odd number!"
ERROR: AssertionError: 3 is an odd number!
julia> @assert isodd(3) "What even are numbers?"
Base.Experimental.register_error_hint
— FunctionExperimental.register_error_hint(handler, exceptiontype)
سجل دالة "تلميح" handler(io, exception)
التي يمكن أن تقترح طرقًا محتملة للمستخدمين لتجاوز الأخطاء. يجب على handler
فحص exception
لمعرفة ما إذا كانت الشروط المناسبة للحصول على تلميح متوفرة، وإذا كان الأمر كذلك، توليد مخرجات إلى io
. يجب على الحزم استدعاء register_error_hint
من داخل دالة __init__
.
بالنسبة لأنواع الاستثناءات المحددة، يُطلب من handler
قبول معلمات إضافية:
MethodError
: قدمhandler(io, exc::MethodError, argtypes, kwargs)
، الذي يقسم المعلمات المجمعة إلى معلمات موضعية ومعلمات مفتاحية.
عند إصدار تلميح، يجب أن تبدأ المخرجات عادةً بـ \n
.
إذا قمت بتعريف أنواع استثناءات مخصصة، يمكن لطريقة showerror
الخاصة بك دعم التلميحات عن طريق استدعاء Experimental.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
# اللون ليس ضروريًا، هذا فقط لإظهار أنه ممكن.
print(io, "\nهل كنت تقصد استدعاء ")
printstyled(io, "`any_number`؟", color=:cyan)
end
end
end
end
ثم إذا قمت باستدعاء Hinter.only_int
على شيء ليس Int
(مما يؤدي إلى تحفيز MethodError
)، فإنه يصدر التلميح:
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.
هل كنت تقصد استدعاء `any_number`؟
أقرب المرشحين هم:
...
التلميحات المخصصة للأخطاء متاحة اعتبارًا من جوليا 1.5.
هذه الواجهة تجريبية وقابلة للتغيير أو الإزالة دون إشعار. لحماية نفسك من التغييرات، ضع في اعتبارك وضع أي تسجيلات داخل كتلة if isdefined(Base.Experimental, :register_error_hint) ... end
.
Base.Experimental.show_error_hints
— FunctionExperimental.show_error_hints(io, ex, args...)
استدعاء جميع المعالجات من Experimental.register_error_hint
لنوع الاستثناء المحدد typeof(ex)
. يجب أن تحتوي args
على أي معلمات أخرى متوقعة من قبل المعالج لذلك النوع.
تلميحات الخطأ المخصصة متاحة اعتبارًا من Julia 1.5.
هذه الواجهة تجريبية وقابلة للتغيير أو الإزالة دون إشعار.
Core.ArgumentError
— TypeArgumentError(msg)
الوسائط المرسلة إلى الدالة غير صالحة. msg
هو رسالة خطأ وصفية.
Core.AssertionError
— TypeAssertionError([msg])
الشرط الذي تم التحقق منه لم يقيم إلى true
. الوسيطة الاختيارية msg
هي سلسلة خطأ وصفية.
أمثلة
julia> @assert false "this is not true"
ERROR: AssertionError: this is not true
عادةً ما يتم رمي AssertionError
من @assert
. ```
Core.BoundsError
— TypeBoundsError([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]
Base.CompositeException
— TypeCompositeException
قم بتغليف Vector
من الاستثناءات التي تم طرحها بواسطة Task
(على سبيل المثال، التي تم إنشاؤها من عامل بعيد عبر قناة أو كتابة إدخال/إخراج محلية تنفذ بشكل غير متزامن أو عامل بعيد تحت pmap
) مع معلومات حول سلسلة الاستثناءات. على سبيل المثال، إذا كانت مجموعة من العمال تنفذ عدة مهام، وفشل عدة عمال، فإن CompositeException
الناتجة ستحتوي على "حزمة" من المعلومات من كل عامل تشير إلى مكان وسبب حدوث الاستثناءات.
Base.DimensionMismatch
— TypeDimensionMismatch([msg])
الأشياء التي تم استدعاؤها لا تتطابق في الأبعاد. الوسيطة الاختيارية msg
هي سلسلة خطأ وصفية.
Core.DivideError
— TypeDivideError()
تمت محاولة القسمة الصحيحة مع قيمة المقام 0.
أمثلة
julia> 2/0
Inf
julia> div(2, 0)
ERROR: DivideError: integer division error
Stacktrace:
[...]
Core.DomainError
— TypeDomainError(val)
DomainError(val, msg)
الحجة val
إلى دالة أو مُنشئ خارج النطاق الصالح.
أمثلة
julia> sqrt(-1)
ERROR: DomainError with -1.0:
sqrt تم استدعاؤه بحجة حقيقية سالبة ولكنه سيعيد نتيجة معقدة فقط إذا تم استدعاؤه بحجة معقدة. حاول sqrt(Complex(x)).
Stacktrace:
[...]
Base.EOFError
— TypeEOFError()
لم يكن هناك المزيد من البيانات المتاحة للقراءة من ملف أو تدفق.
Core.ErrorException
— TypeErrorException(msg)
نوع خطأ عام. قد توفر رسالة الخطأ، في حقل .msg
، تفاصيل أكثر تحديدًا.
أمثلة
julia> ex = ErrorException("لقد قمت بشيء سيء");
julia> ex.msg
"لقد قمت بشيء سيء"
Core.InexactError
— TypeInexactError(name::Symbol, T, val)
لا يمكن تحويل val
بدقة إلى النوع T
في طريقة من دالة name
.
أمثلة
julia> convert(Float64, 1+2im)
ERROR: InexactError: Float64(1 + 2im)
Stacktrace:
[...]
Core.InterruptException
— TypeInterruptException()
تم إيقاف العملية بواسطة مقاطعة من الطرفية (CTRL+C).
لاحظ أنه في نص جولي الذي بدأ بدون خيار -i
(تفاعلي)، لا يتم رمي InterruptException
بشكل افتراضي. يمكن استدعاء Base.exit_on_sigint(false)
في النص لاستعادة سلوك REPL. بدلاً من ذلك، يمكن بدء نص جولي مع
julia -e "include(popfirst!(ARGS))" script.jl
لجعل InterruptException
يتم رميه بواسطة CTRL+C أثناء التنفيذ.
Base.KeyError
— TypeKeyError(key)
عملية الفهرسة في AbstractDict
(Dict
) أو كائن مشابه لـ Set
حاولت الوصول إلى عنصر غير موجود أو حذفه.
Core.LoadError
— TypeLoadError(file::AbstractString, line::Int, error)
حدث خطأ أثناء include
أو require
أو using
ملف. يجب أن تكون تفاصيل الخطأ متاحة في حقل .error
.
لم تعد LoadErrors تصدر بواسطة @macroexpand
و @macroexpand1
و macroexpand
اعتبارًا من Julia 1.7.
Core.MethodError
— TypeMethodError(f, args)
لا توجد طريقة مع توقيع النوع المطلوب في الدالة العامة المعطاة. بدلاً من ذلك، لا توجد طريقة فريدة الأكثر تحديدًا.
Base.MissingException
— TypeMissingException(msg)
استثناء يُرمى عندما يتم مواجهة قيمة missing
في حالة لا تدعمها. قد يوفر رسالة الخطأ، في حقل msg
، تفاصيل أكثر تحديدًا.
Core.OutOfMemoryError
— TypeOutOfMemoryError()
تم تخصيص عملية ما لذاكرة زائدة عن الحد بحيث لا يمكن للنظام أو لجمع القمامة التعامل معها بشكل صحيح.
Core.ReadOnlyMemoryError
— TypeReadOnlyMemoryError()
حاولت عملية الكتابة إلى ذاكرة للقراءة فقط.
Core.OverflowError
— TypeOverflowError(msg)
نتيجة تعبير ما كبيرة جدًا بالنسبة لنوع البيانات المحدد وستسبب التفافًا.
Base.ProcessFailedException
— TypeProcessFailedException
تشير إلى حالة خروج غير طبيعية لعملية. عند تشغيل الأوامر أو الأنابيب، يتم إلقاء هذا الاستثناء للإشارة إلى أنه تم إرجاع رمز خروج غير صفري (أي أن العملية المستدعاة فشلت).
Base.TaskFailedException
— TypeTaskFailedException
يتم طرح هذا الاستثناء بواسطة مكالمة wait(t)
عندما يفشل المهمة t
. يقوم TaskFailedException
بتغليف المهمة الفاشلة t
.
Core.StackOverflowError
— TypeStackOverflowError()
تجاوز استدعاء الدالة حجم مكدس الاستدعاءات. يحدث هذا عادةً عندما يتكرر الاستدعاء بلا حدود.
Base.SystemError
— TypeSystemError(prefix::AbstractString, [errno::Int32])
فشلت مكالمة النظام مع رمز خطأ (في المتغير العالمي errno
).
Core.TypeError
— TypeTypeError(func::Symbol, context::AbstractString, expected::Type, got)
فشل في تأكيد النوع، أو استدعاء دالة داخلية مع نوع وسيط غير صحيح.
Core.UndefKeywordError
— TypeUndefKeywordError(var::Symbol)
لم يتم تعيين وسيط الكلمة الرئيسية المطلوب var
في استدعاء الدالة.
أمثلة
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
Core.UndefRefError
— TypeUndefRefError()
العنصر أو الحقل غير معرف للكائن المعطى.
أمثلة
julia> struct MyType
a::Vector{Int}
MyType() = new()
end
julia> A = MyType()
MyType(#undef)
julia> A.a
ERROR: UndefRefError: access to undefined reference
Stacktrace:
[...]
Core.UndefVarError
— TypeUndefVarError(var::Symbol, [scope])
رمز في النطاق الحالي غير معرف.
أمثلة
julia> a
ERROR: UndefVarError: `a` not defined in `Main`
julia> a = 1;
julia> a
1
Base.StringIndexError
— TypeStringIndexError(str, i)
حدث خطأ عند محاولة الوصول إلى str
عند الفهرس i
الذي ليس صالحًا.
Core.InitError
— TypeInitError(mod::Symbol, error)
حدث خطأ عند تشغيل دالة __init__
لوحدة. الخطأ الفعلي الذي تم طرحه متاح في حقل .error
.
Base.retry
— Functionretry(f; delays=ExponentialBackOff(), check=nothing) -> Function
إرجاع دالة غير مسماة تستدعي الدالة f
. إذا حدث استثناء، يتم استدعاء f
مرة أخرى، في كل مرة تعيد فيها check
القيمة true
، بعد الانتظار لعدد الثواني المحددة في delays
. يجب أن تأخذ check
الحالة الحالية لـ delays
و Exception
كمدخلات.
قبل Julia 1.2، كانت هذه التوقيع مقيدة بـ f::Function
.
أمثلة
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)
Base.ExponentialBackOff
— TypeExponentialBackOff(; n=1, first_delay=0.05, max_delay=10.0, factor=5.0, jitter=0.1)
مكرر Float64
بطول n
حيث تزداد عناصره بشكل أسي بمعدل في الفترة factor
* (1 ± jitter
). العنصر الأول هو first_delay
وجميع العناصر مقيدة بـ max_delay
.
Events
Base.Timer
— MethodTimer(callback::Function, delay; interval = 0)
أنشئ مؤقتًا يقوم بتشغيل الدالة callback
عند انتهاء كل مؤقت.
تستيقظ المهام المنتظرة وتُستدعى الدالة callback
بعد تأخير أولي قدره delay
ثوانٍ، ثم تتكرر مع الفاصل الزمني المحدد بالثواني. إذا كان interval
يساوي 0
، فإن الدالة callback
تُشغل مرة واحدة فقط. تُستدعى الدالة callback
مع وسيط واحد، وهو المؤقت نفسه. أوقف المؤقت عن طريق استدعاء close
. قد لا تزال الدالة callback
تُشغل مرة أخيرة، إذا كان المؤقت قد انتهى بالفعل.
أمثلة
هنا يتم طباعة الرقم الأول بعد تأخير قدره ثانيتين، ثم يتم طباعة الأرقام التالية بسرعة.
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
Base.Timer
— TypeTimer(delay; interval = 0)
أنشئ مؤقتًا يوقظ المهام التي تنتظرها (عن طريق استدعاء wait
على كائن المؤقت).
تستيقظ المهام المنتظرة بعد تأخير أولي لا يقل عن delay
ثوانٍ، ثم تتكرر بعد مرور لا يقل عن interval
ثوانٍ مرة أخرى. إذا كان interval
يساوي 0
، يتم تفعيل المؤقت مرة واحدة فقط. عند إغلاق المؤقت (عن طريق close
)، يتم إيقاظ المهام المنتظرة بخطأ. استخدم isopen
للتحقق مما إذا كان المؤقت لا يزال نشطًا.
interval
عرضة لتراكم انحراف الوقت. إذا كنت بحاجة إلى أحداث دقيقة في وقت مطلق معين، أنشئ مؤقتًا جديدًا عند كل انتهاء مع حساب الفرق إلى الوقت التالي.
يتطلب Timer
نقاط يield لتحديث حالته. على سبيل المثال، لا يمكن استخدام isopen(t::Timer)
لإنهاء حلقة while غير المولدة.
Base.AsyncCondition
— TypeAsyncCondition()
إنشاء شرط غير متزامن يقوم بإيقاظ المهام التي تنتظر ذلك (عن طريق استدعاء wait
على الكائن) عند الإخطار من C بواسطة استدعاء uv_async_send
. يتم إيقاظ المهام المنتظرة بخطأ عندما يتم إغلاق الكائن (عن طريق close
). استخدم isopen
للتحقق مما إذا كان لا يزال نشطًا.
يوفر هذا ترتيب ذاكرة ضمني بين خيوط الإرسال والانتظار.
Base.AsyncCondition
— MethodAsyncCondition(callback::Function)
إنشاء شرط غير متزامن يستدعي دالة callback
المعطاة. يتم تمرير callback
حجة واحدة، وهي كائن الشرط غير المتزامن نفسه.
Reflection
Base.nameof
— Methodnameof(m::Module) -> Symbol
احصل على اسم Module
كـ Symbol
.
أمثلة
julia> nameof(Base.Broadcast)
:Broadcast
Base.parentmodule
— Functionparentmodule(m::Module) -> Module
احصل على Module
المحيط بالوحدة. Main
هو الوالد الخاص به.
انظر أيضًا: names
, nameof
, fullname
, @__MODULE__
.
أمثلة
julia> parentmodule(Main)
Main
julia> parentmodule(Base.Broadcast)
Base
parentmodule(t::DataType) -> Module
حدد الوحدة التي تحتوي على تعريف نوع البيانات (الذي قد يكون مغلفًا بـ UnionAll
).
أمثلة
julia> module Foo
struct Int end
end
Foo
julia> parentmodule(Int)
Core
julia> parentmodule(Foo.Int)
Foo
parentmodule(f::Function) -> Module
حدد الوحدة التي تحتوي على (أول) تعريف لدالة عامة.
parentmodule(f::Function, types) -> Module
حدد الوحدة التي تحتوي على أول طريقة لدالة عامة f
تتطابق مع الأنواع المحددة.
parentmodule(m::Method) -> Module
إرجاع الوحدة التي تم تعريف الطريقة المعطاة m
فيها.
يتطلب تمرير Method
كوسيط جوليا 1.9 أو أحدث.
Base.pathof
— Methodpathof(m::Module)
إرجاع مسار ملف m.jl
الذي تم استخدامه لـ import
الوحدة m
، أو nothing
إذا لم يتم استيراد m
من حزمة.
استخدم dirname
للحصول على جزء الدليل و basename
للحصول على جزء اسم الملف من المسار.
انظر أيضًا pkgdir
.
Base.pkgdir
— Methodpkgdir(m::Module[, paths::String...])
إرجاع الدليل الجذري للحزمة التي أعلنت عن الوحدة m
، أو nothing
إذا لم يتم إعلان m
في حزمة. يمكن أيضًا توفير سلاسل مكونات المسار الإضافية لبناء مسار داخل جذر الحزمة.
للحصول على الدليل الجذري للحزمة التي تنفذ الوحدة الحالية، يمكن استخدام الشكل pkgdir(@__MODULE__)
.
إذا تم إعطاء وحدة امتداد، يتم إرجاع جذر الحزمة الأصلية.
julia> pkgdir(Foo)
"/path/to/Foo.jl"
julia> pkgdir(Foo, "src", "file.jl")
"/path/to/Foo.jl/src/file.jl"
انظر أيضًا pathof
.
يتطلب الوسيط الاختياري paths
على الأقل Julia 1.7.
Base.pkgversion
— Methodpkgversion(m::Module)
ارجع إصدار الحزمة التي استوردت الوحدة m
، أو nothing
إذا لم يتم استيراد m
من حزمة، أو تم استيرادها من حزمة بدون تعيين حقل الإصدار.
يتم قراءة الإصدار من ملف Project.toml الخاص بالحزمة أثناء تحميل الحزمة.
للحصول على إصدار الحزمة التي استوردت الوحدة الحالية، يمكن استخدام الشكل pkgversion(@__MODULE__)
.
تم تقديم هذه الوظيفة في Julia 1.9.
Base.moduleroot
— Functionmoduleroot(m::Module) -> Module
ابحث عن الوحدة الجذرية لوحدة معينة. هذه هي أول وحدة في سلسلة الوحدات الأبوية لـ m
التي هي إما وحدة جذر مسجلة أو التي هي وحدتها الخاصة.
__module__
— Keyword__module__
الحجة __module__
مرئية فقط داخل الماكرو، وتوفر معلومات (في شكل كائن Module
) حول سياق توسيع استدعاء الماكرو. راجع قسم الدليل حول استدعاء الماكرو لمزيد من المعلومات.
__source__
— Keyword__source__
الحجة __source__
مرئية فقط داخل الماكرو، وتوفر معلومات (في شكل كائن LineNumberNode
) حول موقع محلل الشيفرة لعلامة @
من استدعاء الماكرو. راجع قسم الدليل حول استدعاء الماكرو لمزيد من المعلومات.
Base.@__MODULE__
— Macro@__MODULE__ -> الوحدة
احصل على الوحدة
من التقييم في المستوى الأعلى، وهي الوحدة
التي يتم قراءة الكود منها حاليًا.
Base.@__FILE__
— Macro@__FILE__ -> String
قم بتوسيعه إلى سلسلة تحتوي على مسار الملف الذي يحتوي على استدعاء الماكرو، أو سلسلة فارغة إذا تم تقييمه بواسطة julia -e <expr>
. أعد nothing
إذا كانت الماكرو تفتقر إلى معلومات مصدر المحلل. بدلاً من ذلك، انظر PROGRAM_FILE
.
Base.@__DIR__
— Macro@__DIR__ -> String
ماكرو للحصول على المسار المطلق للدليل الحالي كسلسلة نصية.
إذا كان في نص برمجي، فإنه يعيد دليل النص البرمجي الذي يحتوي على استدعاء ماكرو @__DIR__
. إذا تم تشغيله من REPL أو إذا تم تقييمه بواسطة julia -e <expr>
، فإنه يعيد الدليل الحالي.
أمثلة
توضح المثال الفرق في سلوكيات @__DIR__
و pwd()
، من خلال إنشاء نص برمجي بسيط في دليل مختلف عن الدليل الحالي وتنفيذ كلا الأمرين:
julia> cd("/home/JuliaUser") # الدليل العامل
julia> # إنشاء نص برمجي في /home/JuliaUser/Projects
open("/home/JuliaUser/Projects/test.jl","w") do io
print(io, """
println("@__DIR__ = ", @__DIR__)
println("pwd() = ", pwd())
""")
end
julia> # يخرج دليل النص البرمجي والدليل العامل الحالي
include("/home/JuliaUser/Projects/test.jl")
@__DIR__ = /home/JuliaUser/Projects
pwd() = /home/JuliaUser
Base.@__LINE__
— Macro@__LINE__ -> Int
توسيع إلى رقم السطر لموقع استدعاء الماكرو. إرجاع 0
إذا لم يكن من الممكن تحديد رقم السطر.
Base.fullname
— Functionfullname(m::Module)
احصل على الاسم المؤهل بالكامل لوحدة كزوج من الرموز. على سبيل المثال،
أمثلة
julia> fullname(Base.Iterators)
(:Base, :Iterators)
julia> fullname(Main)
(:Main,)
Base.names
— Functionnames(x::Module; all::Bool = false, imported::Bool = false)
احصل على متجه من الأسماء العامة لـ Module
، مستبعدًا الأسماء المهجورة. إذا كان all
صحيحًا، فإن القائمة تتضمن أيضًا الأسماء غير العامة المعرفة في الوحدة، والأسماء المهجورة، والأسماء التي تم إنشاؤها بواسطة المترجم. إذا كان imported
صحيحًا، فإن الأسماء المستوردة صراحة من وحدات أخرى تتضمن أيضًا. يتم إرجاع الأسماء بترتيب مرتب.
كحالة خاصة، تعتبر جميع الأسماء المعرفة في Main
"عامة"، حيث أنه ليس من المعتاد وضع علامة صريحة على الأسماء من Main
كعامة.
!!! ملاحظة sym ∈ names(SomeModule)
لا تعني لا أن isdefined(SomeModule, sym)
. ستعيد names
الرموز المميزة بعلامة public
أو export
، حتى لو لم تكن معرفة في الوحدة.
انظر أيضًا: Base.isexported
، Base.ispublic
، Base.@locals
، @__MODULE__
.
Base.isexported
— Functionisexported(m::Module, s::Symbol) -> Bool
يُرجع ما إذا كان الرمز مُصدّرًا من وحدة.
julia> module Mod
export foo
public bar
end
Mod
julia> Base.isexported(Mod, :foo)
true
julia> Base.isexported(Mod, :bar)
false
julia> Base.isexported(Mod, :baz)
false
Base.ispublic
— Functionispublic(m::Module, s::Symbol) -> Bool
يُرجع ما إذا كان الرمز مُعَلمًا كعام في وحدة.
تُعتبر الرموز المُصدَّرة عامة.
تمت إضافة هذه الدالة ومفهوم العمومية في Julia 1.11.
انظر أيضًا: isexported
, names
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
Base.nameof
— Methodnameof(f::Function) -> Symbol
احصل على اسم Function
عام كرمز. بالنسبة للدوال المجهولة، هذا اسم تم إنشاؤه بواسطة المترجم. بالنسبة لأنواع Function
المعلنة صراحة، يكون اسم نوع الدالة.
Base.functionloc
— Methodfunctionloc(f::Function, types)
إرجاع مجموعة (filename,line)
تعطي موقع تعريف Function
عام.
Base.functionloc
— Methodfunctionloc(m::Method)
إرجاع مجموعة (filename,line)
تعطي موقع تعريف Method
.
Base.@locals
— Macro@locals()
قم بإنشاء قاموس بأسماء (كرموز) وقيم جميع المتغيرات المحلية المعرفة حتى موقع الاستدعاء.
هذه الماكرو تتطلب على الأقل جوليا 1.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)
Core.getglobal
— Functiongetglobal(module::Module, name::Symbol, [order::Symbol=:monotonic])
استرجع قيمة الربط name
من الوحدة module
. يمكن تحديد ترتيب ذري للعملية بشكل اختياري، وإلا فإنه يت default إلى الترتيب المتزايد.
بينما لا يزال الوصول إلى روابط الوحدة باستخدام getfield
مدعومًا للحفاظ على التوافق، يجب دائمًا تفضيل استخدام getglobal
لأن getglobal
يسمح بالتحكم في الترتيب الذري (getfield
دائمًا متزايد) ويشير بشكل أفضل إلى نية الكود لكل من المستخدم والمترجم.
يجب ألا يضطر معظم المستخدمين لاستدعاء هذه الوظيفة مباشرة – يجب تفضيل وظيفة getproperty
أو بناء الجملة المقابل (أي module.name
) في جميع الحالات باستثناء عدد قليل جدًا من حالات الاستخدام المحددة.
تتطلب هذه الوظيفة Julia 1.9 أو أحدث.
انظر أيضًا getproperty
و setglobal!
.
أمثلة
julia> a = 1
1
julia> module M
a = 2
end;
julia> getglobal(@__MODULE__, :a)
1
julia> getglobal(M, :a)
2
Core.setglobal!
— Functionsetglobal!(module::Module, name::Symbol, x, [order::Symbol=:monotonic])
قم بتعيين أو تغيير قيمة الربط name
في الوحدة module
إلى x
. لا يتم إجراء تحويل نوع، لذا إذا تم الإعلان عن نوع بالفعل للربط، يجب أن يكون x
من النوع المناسب أو سيتم طرح خطأ.
بالإضافة إلى ذلك، يمكن تحديد ترتيب ذري لهذه العملية، وإلا فإنه يت default إلى الترتيب الأحادي.
عادةً ما يصل المستخدمون إلى هذه الوظيفة من خلال وظيفة setproperty!
أو بناء الجملة المقابل (أي module.name = x
) بدلاً من ذلك، لذا فإن هذا مخصص فقط لحالات استخدام محددة جدًا.
تتطلب هذه الوظيفة Julia 1.9 أو أحدث.
انظر أيضًا setproperty!
و getglobal
أمثلة
julia> module M; global a; end;
julia> M.a # نفس الشيء مثل `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.jl:42
[2] top-level scope
@ none:1
julia> setglobal!(M, :a, 1)
1
julia> M.a
1
Core.modifyglobal!
— Functionmodifyglobal!(module::Module, name::Symbol, op, x, [order::Symbol=:monotonic]) -> Pair
قم بتنفيذ العمليات بشكل ذري للحصول على وتعيين متغير عالمي بعد تطبيق الدالة op
.
تتطلب هذه الدالة Julia 1.11 أو أحدث.
انظر أيضًا modifyproperty!
و setglobal!
.
Core.swapglobal!
— Functionswapglobal!(module::Module, name::Symbol, x, [order::Symbol=:monotonic])
قم بإجراء العمليات بشكل ذري للحصول على وتعيين متغير عالمي في نفس الوقت.
تتطلب هذه الوظيفة جوليا 1.11 أو أحدث.
انظر أيضًا swapproperty!
و setglobal!
.
Core.setglobalonce!
— Functionsetglobalonce!(module::Module, name::Symbol, value,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> success::Bool
قم بتنفيذ العمليات بشكل ذري لتعيين قيمة عالمية معينة، فقط إذا لم يتم تعيينها مسبقًا.
تتطلب هذه الوظيفة جوليا 1.11 أو أحدث.
انظر أيضًا setpropertyonce!
و setglobal!
.
Core.replaceglobal!
— Functionreplaceglobal!(module::Module, name::Symbol, expected, desired,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> (; old, success::Bool)
قم بتنفيذ العمليات بشكل ذري للحصول على قيمة عالمية وتعيينها بشكل شرطي إلى قيمة معينة.
تتطلب هذه الوظيفة جوليا 1.11 أو أحدث.
انظر أيضًا replaceproperty!
و setglobal!
.
Documentation
(انظر أيضًا فصل documentation.)
Core.@doc
— Macroالوثائق
يمكن توثيق الدوال والأساليب والأنواع عن طريق وضع سلسلة نصية قبل التعريف:
"""
# دالة Foo
`foo(x)`: قم بعمل Foo بشكل مفرط على `x`.
"""
foo(x) = ...
يمكن استخدام ماكرو @doc
مباشرةً لتعيين واسترجاع الوثائق / البيانات الوصفية. يحتوي الماكرو على تحليل خاص بحيث يمكن أن يظهر الكائن الموثق في السطر التالي:
@doc "blah"
function foo() ...
بشكل افتراضي، يتم كتابة الوثائق كـ Markdown، ولكن يمكن استخدام أي كائن كأول وسيط.
توثيق الكائنات بشكل منفصل عن تعريفاتها
يمكنك توثيق كائن قبل أو بعد تعريفه باستخدام
@doc "foo" function_to_doc
@doc "bar" TypeToDoc
بالنسبة للماكرو، تكون الصيغة @doc "macro doc" :(Module.@macro)
أو @doc "macro doc" :(string_macro"")
لماكرو السلسلة النصية. بدون الاقتباس :()
سيتم توثيق توسيع الماكرو.
استرجاع الوثائق
يمكنك استرجاع الوثائق للدوال والماكرو وغيرها من الكائنات على النحو التالي:
@doc foo
@doc @time
@doc md""
الدوال والأساليب
سيؤدي وضع الوثائق قبل تعريف أسلوب (مثل function foo() ...
أو foo() = ...
) إلى توثيق ذلك الأسلوب المحدد، بدلاً من الدالة الكاملة. يتم دمج وثائق الأساليب معًا بالترتيب الذي تم تعريفها به لتوفير الوثائق للدالة.
Base.Docs.HTML
— TypeHTML(s)
: أنشئ كائنًا يقوم بعرض s
كـ html.
HTML("<div>foo</div>")
يمكنك أيضًا استخدام دفق لكميات كبيرة من البيانات:
HTML() do io
println(io, "<div>foo</div>")
end
!!! تحذير HTML
تم تصديره حاليًا للحفاظ على التوافق مع الإصدارات السابقة، ولكن هذا التصدير قديم. يُوصى باستخدام هذا النوع كـ Docs.HTML
أو لاستيراده صراحةً من Docs
.
Base.Docs.Text
— TypeText(s)
: أنشئ كائنًا يقوم بعرض s
كنص عادي.
Text("foo")
يمكنك أيضًا استخدام دفق لكميات كبيرة من البيانات:
Text() do io
println(io, "foo")
end
!!! تحذير Text
تم تصديره حاليًا للحفاظ على التوافق مع الإصدارات السابقة، ولكن هذا التصدير قديم. يُوصى باستخدام هذا النوع كـ Docs.Text
أو لاستيراده صراحةً من Docs
.
Base.Docs.hasdoc
— FunctionDocs.hasdoc(mod::Module, sym::Symbol)::Bool
إرجاع true
إذا كان sym
في mod
يحتوي على سلسلة توثيق و false
خلاف ذلك.
Base.Docs.undocumented_names
— Functionundocumented_names(mod::Module; private=false)
إرجاع متجه مرتب من الرموز غير الموثقة في module
(أي التي تفتقر إلى وثائق). private=false
(الإعداد الافتراضي) يُرجع فقط المعرفات المعلنة باستخدام public
و/أو export
، بينما private=true
يُرجع جميع الرموز في الوحدة (باستثناء الرموز المخفية التي تم إنشاؤها بواسطة المترجم والتي تبدأ بـ #
).
انظر أيضًا: names
, Docs.hasdoc
, Base.ispublic
.
Code loading
Base.identify_package
— FunctionBase.identify_package(name::String)::Union{PkgId, Nothing}
Base.identify_package(where::Union{Module,PkgId}, name::String)::Union{PkgId, Nothing}
حدد الحزمة بواسطة اسمها من مكدس البيئة الحالي، مع إرجاع PkgId
الخاص بها، أو nothing
إذا لم يمكن العثور عليها.
إذا تم توفير وسيط name
فقط، فإنه يبحث في كل بيئة في المكدس ومواردها المباشرة المسماة.
يوفر وسيط where
السياق من حيث البحث عن الحزمة: في هذه الحالة، يتحقق أولاً مما إذا كان الاسم يتطابق مع السياق نفسه، وإلا فإنه يبحث في جميع التبعيات التكرارية (من البيان المحلول لكل بيئة) حتى يعثر على السياق where
، ومن هناك يحدد التبعية بالاسم المقابل.
julia> Base.identify_package("Pkg") # Pkg هو تبعية للبيئة الافتراضية
Pkg [44cfe95a-1eb2-52ea-b672-e2afdf69b78f]
julia> using LinearAlgebra
julia> Base.identify_package(LinearAlgebra, "Pkg") # Pkg ليست تبعية لـ LinearAlgebra
Base.locate_package
— FunctionBase.locate_package(pkg::PkgId)::Union{String, Nothing}
المسار إلى ملف نقطة الدخول للحزمة المقابلة للمعرف pkg
، أو nothing
إذا لم يتم العثور عليه. انظر أيضًا identify_package
.
julia> pkg = Base.identify_package("Pkg")
Pkg [44cfe95a-1eb2-52ea-b672-e2afdf69b78f]
julia> Base.locate_package(pkg)
"/path/to/julia/stdlib/v1.11/Pkg/src/Pkg.jl"
Base.require
— Functionrequire(into::Module, module::Symbol)
تعتبر هذه الدالة جزءًا من تنفيذ using
/ import
، إذا لم يكن الموديل معرفًا بالفعل في Main
. يمكن أيضًا استدعاؤها مباشرة لإعادة تحميل الموديل، بغض النظر عما إذا تم تحميله من قبل (على سبيل المثال، عند تطوير المكتبات بشكل تفاعلي).
تقوم بتحميل ملف مصدر، في سياق موديل Main
، على كل عقدة نشطة، باحثة في المواقع القياسية للملفات. تعتبر require
عملية على المستوى الأعلى، لذا تقوم بتعيين مسار include
الحالي ولكن لا تستخدمه للبحث عن الملفات (انظر المساعدة لـ include
). تُستخدم هذه الدالة عادةً لتحميل كود المكتبة، ويتم استدعاؤها ضمنيًا بواسطة using
لتحميل الحزم.
عند البحث عن الملفات، تبحث require
أولاً عن كود الحزمة في المصفوفة العالمية LOAD_PATH
. تعتبر require
حساسة لحالة الأحرف على جميع المنصات، بما في ذلك تلك التي تحتوي على أنظمة ملفات غير حساسة لحالة الأحرف مثل macOS وWindows.
للحصول على مزيد من التفاصيل حول تحميل الكود، راجع أقسام الدليل حول الموديلات والحوسبة المتوازية.
Base.compilecache
— FunctionBase.compilecache(module::PkgId)
يخلق ملف ذاكرة تخزين مؤقت مسبق التجميع لوحدة وجميع تبعياتها. يمكن استخدام ذلك لتقليل أوقات تحميل الحزم. يتم تخزين ملفات الذاكرة المؤقتة في DEPOT_PATH[1]/compiled
. انظر Module initialization and precompilation لملاحظات مهمة.
Base.isprecompiled
— FunctionBase.isprecompiled(pkg::PkgId; ignore_loaded::Bool=false)
يُرجع ما إذا كان PkgId المعطى ضمن المشروع النشط مُسبق التجميع.
بشكل افتراضي، يتبع هذا الفحص نفس النهج الذي تتبعه عملية تحميل الكود فيما يتعلق بموعد تحميل إصدارات مختلفة من التبعيات مقارنةً بما هو متوقع. لتجاهل الوحدات المحملة والإجابة كما لو كنت في جلسة جوليا جديدة، حدد ignore_loaded=true
.
تتطلب هذه الوظيفة على الأقل جوليا 1.10.
Base.get_extension
— Functionget_extension(parent::Module, extension::Symbol)
إرجاع الوحدة لـ extension
من parent
أو إرجاع nothing
إذا لم يتم تحميل الامتداد.
Internals
Base.GC.gc
— FunctionGC.gc([full=true])
قم بإجراء جمع القمامة. تحدد الحجة full
نوع الجمع: يجمع الجمع الكامل (افتراضي) جميع الكائنات الحية (أي علامة كاملة) ويجب أن يستعيد الذاكرة من جميع الكائنات غير القابلة للوصول. يجمع الجمع التزايدي الذاكرة فقط من الكائنات الشابة التي لا يمكن الوصول إليها.
قد يقرر جامع القمامة إجراء جمع كامل حتى لو تم طلب جمع تزايدي.
!!! تحذير الاستخدام المفرط سيؤدي على الأرجح إلى أداء ضعيف.
Base.GC.enable
— FunctionGC.enable(on::Bool)
تحكم فيما إذا كانت جمع القمامة مفعلة باستخدام وسيط منطقي (true
للتفعيل، false
للتعطيل). ارجع إلى حالة جمع القمامة السابقة.
يجب استخدام تعطيل جمع القمامة بحذر فقط، حيث يمكن أن يتسبب في زيادة استخدام الذاكرة بلا حدود.
Base.GC.@preserve
— MacroGC.@preserve x1 x2 ... xn expr
قم بتمييز الكائنات x1, x2, ...
على أنها قيد الاستخدام أثناء تقييم التعبير expr
. هذا مطلوب فقط في الشيفرة غير الآمنة حيث أن expr
يستخدم ضمنيًا الذاكرة أو الموارد الأخرى المملوكة لأحد x
s.
الاستخدام الضمني لـ x
يغطي أي استخدام غير مباشر للموارد المملوكة منطقيًا لـ x
والتي لا يمكن للمترجم رؤيتها. بعض الأمثلة:
- الوصول إلى ذاكرة كائن مباشرة عبر
Ptr
- تمرير مؤشر إلى
x
إلىccall
- استخدام موارد
x
التي سيتم تنظيفها في المُنهي.
يجب عمومًا ألا يكون لـ @preserve
أي تأثير على الأداء في حالات الاستخدام النموذجية حيث يمدد عمر الكائن لفترة قصيرة. في التنفيذ، لـ @preserve
آثار مثل حماية الكائنات المخصصة ديناميكيًا من جمع القمامة.
أمثلة
عند التحميل من مؤشر باستخدام unsafe_load
، يتم استخدام الكائن الأساسي ضمنيًا، على سبيل المثال يتم استخدام x
ضمنيًا بواسطة unsafe_load(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)
# البديل المفضل
Int(@ccall strlen(x::Cstring)::Csize_t)
end
5
Base.GC.safepoint
— FunctionGC.safepoint()
يُدرج نقطة في البرنامج حيث قد يتم تشغيل جمع القمامة. يمكن أن يكون هذا مفيدًا في حالات نادرة في البرامج متعددة الخيوط حيث تقوم بعض الخيوط بتخصيص الذاكرة (ومن ثم قد تحتاج إلى تشغيل جمع القمامة) بينما تقوم خيوط أخرى بإجراء عمليات بسيطة فقط (لا تخصيص، تبديلات المهام، أو إدخال/إخراج). يسمح استدعاء هذه الوظيفة بشكل دوري في الخيوط غير المخصصة لجمع القمامة بالتشغيل.
هذه الوظيفة متاحة اعتبارًا من Julia 1.4.
Base.GC.enable_logging
— FunctionGC.enable_logging(on::Bool)
عند تشغيله، اطبع إحصائيات حول كل جمع قمامة إلى stderr.
Base.GC.logging_enabled
— FunctionGC.logging_enabled()
إرجاع ما إذا كان تسجيل GC قد تم تمكينه عبر GC.enable_logging
.
Base.Meta.lower
— Functionlower(m, x)
يأخذ التعبير x
ويعيد تعبيرًا مكافئًا في شكل مخفض للتنفيذ في الوحدة m
. انظر أيضًا code_lowered
.
Base.Meta.@lower
— Macro@lower [م] x
Return lowered form of the expression x
in module م
. By default م
is the module in which the macro is called. See also lower
.
Base.Meta.parse
— Methodparse(str, start; greedy=true, raise=true, depwarn=true, filename="none")
قم بتحليل سلسلة التعبير وأعد تعبيرًا (يمكن تمريره لاحقًا إلى eval للتنفيذ). start
هو فهرس وحدة الكود في str
لأحرف البداية التي يجب البدء في التحليل عندها (كما هو الحال مع جميع فهارس السلاسل، هذه ليست فهارس أحرف). إذا كانت greedy
تساوي true
(افتراضي)، ستحاول parse
استهلاك أكبر قدر ممكن من المدخلات؛ خلاف ذلك، ستتوقف بمجرد أن تكون قد حللت تعبيرًا صالحًا. ستعيد التعبيرات غير المكتملة ولكنها صحيحة نحويًا Expr(:incomplete, "(رسالة خطأ)")
. إذا كانت raise
تساوي true
(افتراضي)، ستؤدي أخطاء النحو بخلاف التعبيرات غير المكتملة إلى رفع خطأ. إذا كانت raise
تساوي false
، ستعيد parse
تعبيرًا سيؤدي إلى رفع خطأ عند التقييم. إذا كانت depwarn
تساوي false
، ستُخفف تحذيرات الإهمال. تُستخدم حجة filename
لعرض التشخيصات عند رفع خطأ.
julia> Meta.parse("(α, β) = 3, 5", 1) # بداية السلسلة
(:((α, β) = (3, 5)), 16)
julia> Meta.parse("(α, β) = 3, 5", 1, greedy=false)
(:((α, β)), 9)
julia> Meta.parse("(α, β) = 3, 5", 16) # نهاية السلسلة
(nothing, 16)
julia> Meta.parse("(α, β) = 3, 5", 11) # فهرس 3
(:((3, 5)), 16)
julia> Meta.parse("(α, β) = 3, 5", 11, greedy=false)
(3, 13)
Base.Meta.parse
— Methodparse(str; raise=true, depwarn=true, filename="none")
قم بتحليل سلسلة التعبير بشكل جشع، مع إرجاع تعبير واحد. يتم طرح خطأ إذا كانت هناك أحرف إضافية بعد التعبير الأول. إذا كان raise
هو true
(افتراضي)، ستؤدي أخطاء التركيب إلى رفع خطأ؛ خلاف ذلك، ستعيد parse
تعبيرًا سيؤدي إلى رفع خطأ عند التقييم. إذا كان depwarn
هو false
، سيتم كتم تحذيرات الإهمال. يتم استخدام وسيط filename
لعرض التشخيصات عند رفع خطأ.
julia> Meta.parse("x = 3")
:(x = 3)
julia> Meta.parse("1.0.2")
ERROR: ParseError:
# Error @ none:1:1
1.0.2
└──┘ ── constant عددي غير صالح
[...]
julia> Meta.parse("1.0.2"; raise = false)
:($(Expr(:error, "constant عددي غير صالح "1.0."")))
julia> Meta.parse("x = ")
:($(Expr(:incomplete, "غير مكتمل: نهاية مبكرة للإدخال")))
Base.Meta.ParseError
— TypeParseError(msg)
التعبير المرسل إلى دالة parse
لم يكن بالإمكان تفسيره كتعبير جوليا صالح.
Core.QuoteNode
— TypeQuoteNode
قطعة من الشيفرة المقتبسة، التي لا تدعم الاستبدال. راجع قسم الدليل حول QuoteNodes لمزيد من التفاصيل.
Base.macroexpand
— Functionmacroexpand(m::Module, x; recursive=true)
خذ التعبير x
وأعد تعبيرًا مكافئًا مع إزالة جميع الماكرو (توسيعها) للتنفيذ في الوحدة m
. يتحكم الكلمة الرئيسية recursive
في ما إذا كانت المستويات الأعمق من الماكرو المتداخلة سيتم توسيعها أيضًا. يتم توضيح ذلك في المثال أدناه:
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)
Base.@macroexpand
— Macro@macroexpand [mod,] ex
ارجع التعبير المعادل مع إزالة جميع الماكرو (توسيع). إذا تم توفير وسيطين، فإن الأول هو الوحدة التي يتم التقييم فيها.
هناك اختلافات بين @macroexpand
و macroexpand
.
- بينما تأخذ
macroexpand
وسيط كلمة رئيسيةrecursive
، فإن@macroexpand
تكون دائمًا تكرارية. للحصول على نسخة غير تكرارية من الماكرو، انظر@macroexpand1
. - بينما تحتوي
macroexpand
على وسيطmodule
صريح، فإن@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 (ماكرو مع 1 طريقة)
julia> M.f()
(1, 1, 2)
مع @macroexpand
، يتوسع التعبير حيث يظهر @macroexpand
في الكود (الوحدة M
في المثال). مع macroexpand
، يتوسع التعبير في الوحدة المعطاة كأول وسيط.
يتطلب الشكل ذو الوسيطين على الأقل Julia 1.11.
Base.@macroexpand1
— Macro@macroexpand1 [mod,] ex
نسخة غير تكرارية من @macroexpand
.
Base.code_lowered
— Functioncode_lowered(f, types; generated=true, debuginfo=:default)
إرجاع مصفوفة من الأشكال المنخفضة (IR) للطرق المطابقة للدالة العامة المعطاة وتوقيع النوع.
إذا كان generated
هو false
، فإن مثيلات CodeInfo
المعادة ستتوافق مع تطبيقات النسخ الاحتياطي. يتم طرح خطأ إذا لم يوجد تطبيق احتياطي. إذا كان generated
هو true
، فإن هذه المثيلات من CodeInfo
ستتوافق مع أجسام الطرق الناتجة عن توسيع المولدات.
تتحكم الكلمة الرئيسية debuginfo
في كمية بيانات التعريف البرمجية الموجودة في المخرجات.
لاحظ أنه سيتم طرح خطأ إذا لم تكن types
أنواع ورقية عندما يكون generated
هو true
وأي من الطرق المقابلة هي طريقة @generated
.
Base.code_typed
— Functioncode_typed(f, types; kw...)
يعيد مصفوفة من الشكل المنخفض المستنتج من النوع (IR) للطرق التي تتطابق مع الدالة العامة المحددة وتوقيع النوع.
الوسائط الرئيسية
optimize::Bool = true
: اختياري، يتحكم فيما إذا كانت التحسينات الإضافية، مثل الإدراج، تُطبق أيضًا.debuginfo::Symbol = :default
: اختياري، يتحكم في كمية بيانات التعريف البرمجية الموجودة في المخرجات، الخيارات الممكنة هي:source
أو:none
.
الوسائط الداخلية
يجب اعتبار هذا القسم داخليًا، وهو مخصص فقط لمن يفهم تفاصيل مترجم جوليا.
world::UInt = Base.get_world_counter()
: اختياري، يتحكم في عمر العالم الذي يجب استخدامه عند البحث عن الطرق، استخدم عمر العالم الحالي إذا لم يتم تحديده.interp::Core.Compiler.AbstractInterpreter = Core.Compiler.NativeInterpreter(world)
: اختياري، يتحكم في المترجم المجرد الذي يجب استخدامه، استخدم المترجم الأصلي إذا لم يتم تحديده.
أمثلة
يمكن للمرء وضع أنواع الوسائط في مجموعة للحصول على code_typed
المقابل.
julia> code_typed(+, (Float64, Float64))
1-element Vector{Any}:
CodeInfo(
1 ─ %1 = Base.add_float(x, y)::Float64
└── return %1
) => Float64
Base.precompile
— Functionprecompile(f, argtypes::Tuple{Vararg{Any}})
قم بترجمة الدالة المعطاة f
لزوج المعاملات (من الأنواع) argtypes
، ولكن لا تقم بتنفيذها.
precompile(f, argtypes::Tuple{Vararg{Any}}, m::Method)
قم بترتيب مسبق لطريقة معينة لأنواع الوسائط المعطاة. يمكن استخدام ذلك لترتيب مسبق لطريقة مختلفة عن تلك التي سيتم اختيارها عادةً بواسطة التوجيه، وبالتالي محاكاة invoke
.
Base.jit_total_bytes
— FunctionBase.jit_total_bytes()
إرجاع إجمالي المبلغ (بالبايت) المخصص من قبل المترجم في الوقت المناسب، مثل الشيفرة الأصلية والبيانات.
Meta
Base.Meta.quot
— FunctionMeta.quot(ex)::Expr
اقتبس التعبير ex
لإنتاج تعبير برأس quote
. يمكن استخدام ذلك على سبيل المثال لتمثيل كائنات من نوع Expr
في شجرة التحليل. انظر أيضًا قسم الدليل حول QuoteNode.
أمثلة
julia> eval(Meta.quot(:x))
:x
julia> dump(Meta.quot(:x))
Expr
head: Symbol quote
args: Array{Any}((1,))
1: Symbol x
julia> eval(Meta.quot(:(1+2)))
:(1 + 2)
Base.isexpr
— FunctionMeta.isexpr(ex, head[, n])::Bool
ارجع true
إذا كان ex
هو Expr
من النوع المعطى head
و بشكل اختياري أن تكون قائمة المعاملات بطول n
. يمكن أن يكون head
Symbol
أو مجموعة من Symbol
s. على سبيل المثال، للتحقق من أنه تم تمرير تعبير استدعاء دالة إلى ماكرو، يمكنك استخدام isexpr(ex, :call)
.
أمثلة
julia> ex = :(f(x))
:(f(x))
julia> Meta.isexpr(ex, :block)
false
julia> Meta.isexpr(ex, :call)
true
julia> Meta.isexpr(ex, [:block, :call]) # رؤوس متعددة ممكنة
true
julia> Meta.isexpr(ex, :call, 1)
false
julia> Meta.isexpr(ex, :call, 2)
true
Base.isidentifier
— Function isidentifier(s) -> Bool
ارجع ما إذا كان الرمز أو السلسلة s
يحتوي على أحرف يتم تحليلها كمعرف عادي صالح (ليس عامل ثنائي/وحيد) في كود جوليا؛ انظر أيضًا Base.isoperator
.
داخليًا، تسمح جوليا بأي تسلسل من الأحرف في Symbol
(باستثناء \0
s)، وتستخدم الماكرو تلقائيًا أسماء المتغيرات التي تحتوي على #
لتجنب تصادم الأسماء مع الكود المحيط. لكي يتعرف المحلل على متغير، يستخدم مجموعة محدودة من الأحرف (تم توسيعها بشكل كبير بواسطة Unicode). تجعل isidentifier()
من الممكن استعلام المحلل مباشرة عما إذا كان الرمز يحتوي على أحرف صالحة.
أمثلة
julia> Meta.isidentifier(:x), Meta.isidentifier("1x")
(true, false)
Base.isoperator
— Functionisoperator(s::Symbol)
ارجع true
إذا كان الرمز يمكن استخدامه كعامل، وfalse
خلاف ذلك.
أمثلة
julia> Meta.isoperator(:+), Meta.isoperator(:f)
(true, false)
Base.isunaryoperator
— Functionisunaryoperator(s::Symbol)
ارجع true
إذا كان الرمز يمكن استخدامه كعامل أحادي (بادئة)، وfalse
خلاف ذلك.
أمثلة
julia> Meta.isunaryoperator(:-), Meta.isunaryoperator(:√), Meta.isunaryoperator(:f)
(true, true, false)
Base.isbinaryoperator
— Functionisbinaryoperator(s::Symbol)
ارجع true
إذا كان الرمز يمكن استخدامه كعامل ثنائي (داخل الجملة)، وfalse
خلاف ذلك.
أمثلة
julia> Meta.isbinaryoperator(:-), Meta.isbinaryoperator(:√), Meta.isbinaryoperator(:f)
(true, false, false)
Base.Meta.show_sexpr
— FunctionMeta.show_sexpr([io::IO,], ex)
عرض التعبير ex
كـ S-expression بأسلوب lisp.
أمثلة
julia> Meta.show_sexpr(:(f(x, g(y,z))))
(:call, :f, :x, (:call, :g, :y, :z))