بازه نشاندهندهی فاصلهای بین دو مقدار است.
رایجترین نوعهایی که از بازه پشتیبانی میکنند Integer و String هستند.
از بازهها میتوان برای کارهای زیادی استفاده کرد، مثل ساختن سریع یک مجموعه، برش رشتهها، بررسی اینکه مقداری در یک بازه قرار دارد یا نه، و پیمایش.
آنها با عملگر بازهی .. یا ... ساخته میشوند (به ترتیب شامل و غیرشامل).
1..5 # => 1..5
1...5 # => 1...5
(1..5).to_a # => [1, 2, 3, 4, 5]
(1...5).to_a # => [1, 2, 3, 4]
دلیل وجود دو عملگر بازه این است که بتوان بازههایی ساخت که مقدار پایانی را شامل شوند یا نه، که مثلاً هنگام کار با اندیسهایی که از صفر شروع میشوند میتواند مفید باشد.
بازهها را میتوان با سازندهی Range هم ساخت.
Range.new(1, 5) # A range containing 1, 2, 3, 4, 5
وقتی در Ruby با عملگرهای بازهی .. یا ... بازهای میسازید و میخواهید متدی را روی آن فراخوانی کنید، باید بازه را داخل پرانتز بگذارید.
دلیلش این است که در غیر این صورت، متد روی آرگومان دوم عملگر بازه فراخوانی میشود.
(1..5).sum # => 15
1..5.sum # => Error: undefined method `sum' for 5:Integer (NoMethodError)
وقتی میخواهید رشتهای را ببرید، میتوانید از عملگر بازه برای گرفتن زیررشته استفاده کنید؛ یعنی با ساختن بازهای از اندیس شروع تا اندیس پایان زیررشته.
"Hello World"[0..4] # => "Hello"
"Hello World"[6..10] # => "World"
همچنین میتوانید از اندیسهای منفی استفاده کنید تا زیررشته را از انتهای رشته بگیرید.
"Hello World"[-5..-1] # => "World"
"Hello World"[6..-4] # => "Wo"
بازهها مجموعهای از متدها دارند که میتوان با آنها کار کرد. برای مثال، با این متدها میتوان مجموع همهی مقادیر بازه را به دست آورد یا بررسی کرد که آیا بازه مقداری را در بر میگیرد یا نه.
| متد | توضیح | مثال |
|---|---|---|
sum |
مجموع همهی مقادیر بازه را برمیگرداند | (1..5).sum # => 15 |
size |
اندازهی بازه را برمیگرداند | (1..5).size # => 5 |
include? |
اگر بازه مقدار دادهشده را در بر بگیرد true و در غیر این صورت false را برمیگرداند |
(1..5).include?(3) # => true |
یک بازه میتواند بیپایان و بیآغاز باشد.
بازهی بیپایان یا بیآغاز مقدار شروع یا پایانش nil است، اما هنگام تعریف بازه میتوان nil را حذف کرد.
استفاده از بازههای بیآغاز و بیپایان وقتی مفید است که مثلاً بخواهید رشتهای را از ابتدا یا تا انتها ببرید.
"Hello World"[0..] # => "Hello World"
"Hello World"[4..] # => "o World"
"Hello World"[..5] # => "Hello "
اگر بازهی بیپایان روی یک مجموعه به کار نرود، بدون احتیاط میتواند توالی بیپایانی ایجاد کند.
رشتهها هم میتوانند در بازهها به کار روند و به شما امکان میدهند فاصلهای از رشتهها بین دو رشته به دست آورید. رفتارش با بعضی رشتهها ممکن است کمی غیرمنتظره باشد، پس با احتیاط از آن استفاده کنید.
"aa".."az".to_a # => ["aa", "ab", "ac", ..., "az"]
Ruby به شما امکان میدهد از اشیای سفارشی در بازهها استفاده کنید. شرط این کار آن است که شیء موارد زیر را پیادهسازی کند:
Comparable را شامل شودsucc
<=>
این متدها باعث میشوند بازه بتواند روی شیء پیمایش کند و اشیای داخل بازه را مقایسه کند.
class Foo
include Comparable
attr_reader :value
def initialize(value)
@value = value
end
def succ
Foo.new(value + 1)
end
def <=>(other)
value <=> other.value
end
end
(Foo.new(1)..Foo.new(5))
# => #<Foo:0x7f3552bebe70 @value=1>, #<Foo:0x7f3552bebe50 @value=2>, #<Foo:0x7f3552bebe40 @value=3>, #<Foo:0x7f3552bebe30 @value=4>, #<Foo:0x7f3552bebe20 @value=5>