من الأهداف المركزية للغة Julia القدرة على إجراء حسابات على البيانات الرقمية بسرعة وكفاءة. وعلى كميات ضخمة من البيانات الرقمية.
عادةً تُخزَّن هذه البيانات في مصفوفات (أو في نوع مرتبط بها)، لذا من المعقول القول إن المصفوفات تقع في قلب لغة Julia.
يمكن أن تكون المصفوفات بأي حجم (رهنًا بقيود الذاكرة في عتادك فقط)، ويمكن أن تمتلك أي عدد من الأبعاد.
يركّز هذا المفهوم التمهيدي على أساسيات المصفوفات أحادية البعد، التي تُسمّى المتجهات.
في Julia، المتجه متتابعة مرتّبة من القيم يمكن الوصول إليها برقم الفهرس.
أبسط طريقة لإنشاء متجه هي سرد القيم بين الأقواس المربعة:
julia> num_vec = [1, 4, 9]
3-element Vector{Int64}:
1
4
9
julia> str_vec = ["arrays", "are", "important"]
3-element Vector{String}:
"arrays"
"are"
"important"
يطابق نوع المتجه نوع كل عنصر.
إذن هل يجب أن تكون المتجهات متجانسة (كل العناصر من النوع نفسه)؟
إلى حد ما، نعم، ويُوصى بالسعي إلى ذلك إن أردت أفضل أداء.
لكن Julia تستطيع التحايل على هذا القيد (عند الحاجة) باستخدام النوع Any:
julia> mixed_vector = [1, "str", 'c']
3-element Vector{Any}:
1
"str"
'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
عند إنشاء متجه فارغ، تستخدم Julia النوع Any كنوع افتراضي للعناصر، لكن يمكن تعريفه بشكل أدق بوسم المصفوفة الفارغة بنوع العنصر المطلوب.
julia> empty_vec = []
Any[]
julia> empty_int_vec = Int64[]
Int64[]
يرجى قراءة هذه القاعدة وتذكّرها:
هذا مألوف لكل من استخدم لغات علم البيانات الأخرى (R و Matlab و Fortran...)، لكنه قد يبدو مفاجئًا لعلماء الحاسوب ذوي الخلفية في اللغات الشبيهة بـ C.
عدا ذلك، تعمل الفهارس كما قد تتوقع: ضعها فقط بين الأقواس المربعة:
squares = [0, 1, 4, 9, 16]
squares[1] # 0
squares[3] # 4
squares[begin] # 0 ("begin" is synonym for 1)
squares[end] # 16 ("end" is synonym for length(squares))
لاحظ سهولة الفهرسة بـ end (وهو مفيد جدًا) وbegin (وهو على الأرجح ليس كذلك).
قد يتساءل مبرمجو Python عن الفهارس السالبة.
لا تفعل ذلك: فهي ليست جزءًا من Julia، وسترفع BoundsError، وكذلك أي فهرس أصغر من 1 أو أكبر من length(squares).
المتجهات في Julia قابلة للتغيير: يمكننا تغيير محتوى الخلايا الفردية.
julia> vals = [1, 3, 5, 7]
4-element Vector{Int64}:
1
3
5
7
julia> vals[2] = 4 # reassign the value of this element
4
# Only the value at position 2 changes:
julia> vals
4-element Vector{Int64}:
1
4
5
7
تتوفر دوال كثيرة للتعامل مع المتجهات، وإن كانت وثائق Julia تعمّمها إلى "مجموعات" بدلًا من المتجهات.
لاحظ أنه حسب العُرف، تحمل الدوال التي تغيّر مدخلاتها علامة ! في اسمها.
لن يفرض المترجم ذلك، لكنه عُرف راسخ جدًا في عالم Julia.
وهذه بعض الدوال المفيدة:
push!().pop!().pushfirst!() وpopfirst!().insert!() وdeleteat!().julia> vals = [1, 3]
2-element Vector{Int64}:
1
3
julia> push!(vals, 5, 6) # can add multiple values
4-element Vector{Int64}:
1
3
5
6
julia> pop!(vals) # mutates vals, return popped value
6
julia> vals
3-element Vector{Int64}:
1
3
5
بصفتها ساحرةً ناشئة، تحتاج إيليز إلى التمرّن على بعض الأساسيات. لديها رزمة من البطاقات تريد أن تتعامل معها.
ولتسهيل الأمور قليلًا، لا تستخدم سوى البطاقات من 1 إلى 10، لذا يمكن تمثيل رزمتها من البطاقات بمتجه من الأعداد. ويقابل موضع كل بطاقة معينة الفهرسَ في المتجه.
لاختيار بطاقة، أرجِع البطاقة عند الفهرس position من الرزمة المعطاة.
julia> stack = [1, 2, 4, 1];
julia> position = 3;
julia> get_item(stack, position)
4
قم ببعض خفّة اليد واستبدل البطاقة عند الفهرس position ببطاقة الاستبدال المعطاة.
وأرجِع الرزمة المعدَّلة.
julia> stack = [1, 2, 4, 1];
julia> position = 3;
julia> replacement_card = 6;
julia> set_item!(stack, position, replacement_card)
[1, 2, 6, 1]
اجعل بطاقة تظهر بإدراج بطاقة جديدة في أعلى الرزمة. وأرجِع الرزمة المعدَّلة.
julia> stack = [5, 9, 7, 1];
julia> new_card = 8;
julia> insert_item_at_top!(stack, new_card)
[5, 9, 7, 1, 8]
اجعل بطاقة تختفي بإزالة البطاقة عند الموضع position المعطى من الرزمة.
وأرجِع الرزمة المعدَّلة.
julia> stack = [3, 2, 6, 4, 8];
julia> position = 3;
julia> remove_item!(stack, position)
[3, 2, 4, 8]
اجعل بطاقة تختفي بإزالة البطاقة التي في أعلى الرزمة. وأرجِع الرزمة المعدَّلة.
julia> stack = [3, 2, 6, 4, 8];
julia> remove_item_from_top!(stack)
[3, 2, 6, 4]
اجعل بطاقة تظهر بإدراج بطاقة جديدة في أسفل الرزمة. وأرجِع الرزمة المعدَّلة.
julia> stack = [5, 9, 7, 1];
julia> new_card = 8;
julia> insert_item_at_bottom!(stack, new_card)
[8, 5, 9, 7, 1]
اجعل بطاقة تختفي بإزالة البطاقة التي في أسفل الرزمة. وأرجِع الرزمة المعدَّلة.
julia> stack = [8, 5, 9, 7, 1];
julia> remove_item_at_bottom!(stack)
[5, 9, 7, 1]
تحقق مما إذا كان حجم الرزمة يساوي stack_size أم لا.
julia> stack = [3, 2, 6, 4, 8];
julia> stack_size = 4;
julia> check_size_of_stack(stack, stack_size)
false
سجّل في Exercism لتتعلّم وتتقن Julia عبر 35 مفهومًا128 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.