დიაპაზონი წარმოადგენს მნიშვნელობების ინტერვალს — (1..10) რიცხვებისთვის, ('a'..'z') ასოებისთვის და ა.შ. დიაპაზონები არის ობიექტები სასარგებლო მეთოდებით, რომელიც გამოიყენება იტერაციისთვის, ნაჭუჭიანებისთვის, წევრობის ტესტებისთვის და case შესატყვისობისთვის. ისინი Ruby-ის მოკლე, გამომეტყველებული ფიჩა.
დიაპაზონების შექმნა (.. vs ...)
(1..5) # INCLUSIVE — 1, 2, 3, 4, 5 (includes the end)
(1...5) # EXCLUSIVE — 1, 2, 3, 4 (excludes the end)
('a'..'e') # 'a', 'b', 'c', 'd', 'e' — works on letters too
მთავარი განსხვავება: .. მოიცავს დასასრულს, ... აკრძალავს მას (მესამე წერტილი "დასასრულს მოშორებით ხდის"). საყო გახსოვებული პუნქტი.
იტერაცია და კონვერტაცია
(1..5).each { |n| puts n } # iterate — 1 to 5
(1..5).to_a # [1, 2, 3, 4, 5] — convert to an array
(1..10).map { |n| n * 2 } # ranges support Enumerable methods
(1..100).sum # 5050
(1..10).select(&:even?) # [2, 4, 6, 8, 10]
დიაპაზონები მოიცავენ Enumerable-ს, ამიტომ ისინი მხარს უჭერენ each, map, select და ა.შ. — და to_a მათ მასივში გარდაქმნის.
წევრობის ტესტირება (ეფექტური)
(1..100).include?(50) # true
(1..100).cover?(50) # true — faster (doesn't iterate, just checks endpoints)
age = 25
(18..65).include?(age) # check if a value falls in a range
include?/cover? ტესტირებენ წევრობას ეფექტურად (განსაკუთრებით cover?, რომელიც მხოლოდ ბოლოების შემოწმებას ახდენს ბმულების გარეშე).
დიაპაზონები case განცხადებებსა და ნაჭუჭიანებაში
# case/when with ranges — clean range-based branching
grade = case score
when 90..100 then "A"
when 80..89 then "B"
when 0..79 then "F"
end
# array/string slicing with ranges
[10, 20, 30, 40, 50][1..3] # [20, 30, 40] — slice by range
"hello world"[0..4] # "hello" — substring by range
# endless/beginless ranges (Ruby 2.6+)
arr[2..] # from index 2 to the end
(1..) # 1 to infinity (with lazy evaluation)
რატომ აქვს მნიშვნელობა
დიაპაზონები არის სასარგებლო, გამომეტყველებული Ruby ფიჩა, რომელიც გამოიყენება ბევრ საერთო სცენარში, ამიტომ მათი გაგება ღირებული ყოველდღიური ცოდნაა.
ისინი მოკლედ წარმოადგენენ ინტერვალებს (რიცხვითი, ანბანური) და ჩნდებიან რამდენიმე ხშირ კონტექსტში: იტერაცია ((1..5).each — მოკლე გზა მიმდევრობის ციკლის გასწავლებისთვის), ნაჭუჭიანება მასივებსა და სტრიქონებში (arr[1..3], str[0..4] — ქვე-მიმდევრობების ელეგანტური ამოღება), წევრობის ტესტირება (include?/cover? — იმის შემოწმება, ეცემა თუ არა მნიშვნელობა ინტერვალში, cover? ეფექტურია მხოლოდ ბოლოების შემოწმებით), და განსაკუთრებით case/when შესატყვისობა (სუფთა დიაპაზონ-ზე ფუძემიანი განტოტოვება, როგორც აფასება ქულების დიაპაზონებით — ხშირი, წაკითხული ნიმუში).
მნიშვნელოვანი .. (მოიცავს) vs ... (გამორიცხავს) განსხვავების გაგება აუცილებელია დიაპაზონების სწორად გამოსაყენებლად (და მოიხსენიება, როგორც ხშირი ბნელი ადგილი).
ისაც, რომ დიაპაზონები მოიცავენ Enumerable-ს (ამიტომ ისინი მხარს უჭერენ map/select/და ა.შ.), თუ როგორ გამოიყენება ისინი იტერაციისთვის, ნაჭუჭიანებისთვის, წევრობისთვის და case შესატყვისობისთვის, და თანამედროვე ფიჩა (უსასრულო/დაწყებული დიაპაზონები) ფარავს პრაქტიკულ გამოყენებას.
ვინაიდან დიაპაზონები ხშირად გვხვდება იდიომატურ Ruby-ში (იტერაცია, ნაჭუჭიანება, დიაპაზონ-ზე ფუძემიანი პირობა, მნიშვნელობის დიაპაზონის ვალიდაცია), და რადგან ისინი მოკლე, გამომეტყველებული გზა ინტერვალების დამუშავებისთვის, დიაპაზონების გაგება — მათი სინტაქსი (მოიცავს vs გამორიცხავს), მეთოდები და საერთო გამოყენება (იტერაცია, ნაჭუჭიანება, წევრობა, case შესატყვისობა) — არის სასარგებლო, პრაქტიკულად შესაბამისი ცოდნა სუფთა, იდიომატური Ruby-ის წერტილებისთვის, რომელიც მიმდევრობებსა და ინტერვალებს ელეგანტურად დამუშავებს.
