ধরুন, আপনি 1000 পর্যন্ত সব অ-ঋণাত্মক ইন্টিজার চান। এগুলো যদি একটি অ্যারেতে টাইপ করতে হতো, তাহলে সেটা হাস্যকর হতো।
এর জন্যই আমাদের আছে range টাইপটি:
julia> 0:1000
0:1000
julia> typeof(0:1000)
UnitRange{Int64}
রেঞ্জ খুব কমন: শুধু টাইপিং বাঁচানোর জন্যই নয়, ফাংশন থেকে রিটার্ন টাইপ হিসেবেও।
খেয়াল করুন, রেঞ্জ অ্যারে নয়।
অ্যারে শুরুতে ডিফাইন করা হয় ("গ্রিডি" ইভ্যালুয়েশন), আর এর জন্য অ্যারের দৈর্ঘ্যের সমানুপাতিক স্টোরেজ লাগে।
এর বিপরীতে, রেঞ্জ হলো একটি সিকোয়েন্স তৈরি করার নির্দেশাবলির সমষ্টি মাত্র ("লেজি" ইভ্যালুয়েশন, বা একটি "ইটারেটর")।
রেঞ্জকে অ্যারে হিসেবে দরকার হলে, রূপান্তরের জন্য collect() ফাংশনটি ব্যবহার করুন:
julia> collect(0:5)
6-element Vector{Int64}:
0
1
2
3
4
5
চাইলে আউটপুট অ্যারের টাইপ নির্দিষ্ট করতে collect(type, range) ব্যবহার করতে পারেন।
স্টেপ সাইজ নির্দিষ্ট করা যায়, এক্ষেত্রে 0.3:
julia> collect(1.0:0.3:2.0)
4-element Vector{Float64}:
1.0
1.3
1.6
1.9
তাহলে সিনট্যাক্স হলো start:stepsize:stop।
ইন্টিজারের উদাহরণে যেমনটা দেখা যায়, দুই প্রান্তের সীমাই অন্তর্ভুক্ত।
স্টেপ সাইজ দিয়ে যদি stop - start নিঁখুতভাবে ভাগ না যায়, তাহলে শেষ এলিমেন্টটি stop ছাড়িয়ে যাওয়া এড়াবে।
আরও সূক্ষ্ম নিয়ন্ত্রণের জন্য Base.range() ফাংশনটি ব্যবহার করুন, যাতে আরও কিছু অপশন আছে।
সংখ্যা ছাড়া অন্য সিকোয়েন্সও রেঞ্জে ব্যবহার করা যায়। সবচেয়ে সহজ উদাহরণ হলো ASCII অক্ষর:
julia> 'a':'d'
'a':1:'d'
julia> typeof('a':'d')
StepRange{Char, Int64}
julia> collect('a':'d')
4-element Vector{Char}:
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
'd': ASCII/Unicode U+0064 (category Ll: Letter, lowercase)
Char টাইপটি আরেকটি কনসেপ্টে আরও বিস্তারিতভাবে আলোচনা করা হবে।
আপাতত এগুলোকে একক উদ্ধৃতি চিহ্নের ভেতরে থাকা একক ক্যারেক্টার হিসেবে ধরে নিন।
first() আর last() দিয়ে রেঞ্জের সীমা যাচাই করুন।
কোনো নির্দিষ্ট মান একটি রেঞ্জের অংশ কি না তা বের করা প্রায়ই কাজে লাগে।
এর পেছনের ফাংশনটি in(), তবে ইনফিক্স অপারেটর in বা তার আরও গাণিতিক সমার্থক ∈ ব্যবহার করাই বেশি কমন।
উপযুক্ত এডিটরে ∈ লেখার শর্টকাট হলো \in তারপর tab।
r = 1:10 # => 1:10
first(r) # => 1
last(r) # => 10
7 in r # => true
11 ∈ r # => false
এখানে in বা ∈ অপারেটরটি রেঞ্জের সাথে ব্যবহার করা হয়েছে, তবে এটি ভেক্টর, সেট আর ডিকশনারির মতো আরও কিছু কালেকশন টাইপের সাথেও ব্যবহার করা যায়।
অ্যারে ইনডেক্সিংয়ে ইন্টিজার রেঞ্জ আর অ্যারে ব্যবহার করা যায়:
nums = collect(10.0:50.0)
nums[3:2:7] # gives [12.0, 14.0, 16.0]
nums[ [3, 5, 7] ] # also gives [12.0, 14.0, 16.0]
end-এর সাথে ব্যবহারও কাজ করে, যদিও অপারেটর প্রিসিডেন্সের কারণে প্রথম বন্ধনী লাগতে পারে:
nums[(end - 3):end]
4-element Vector{Float64}:
47.0
48.0
49.0
50.0
অবশ্যই, ইনডেক্সের যেকোনো এলিমেন্ট আগে থেকেই থাকা কোনো ইন্টিজার ভ্যারিয়েবল হতে পারে।