با

بازه در Ruby

1 تمرین

درباره‌ی بازه

بازه نشان‌دهنده‌ی فاصله‌ای بین دو مقدار است. رایج‌ترین نوع‌هایی که از بازه پشتیبانی می‌کنند 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
Note

وقتی در 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 "
Caution

اگر بازه‌ی بی‌پایان روی یک مجموعه به کار نرود، بدون احتیاط می‌تواند توالی بی‌پایانی ایجاد کند.

بازه‌های رشته‌ای

رشته‌ها هم می‌توانند در بازه‌ها به کار روند و به شما امکان می‌دهند فاصله‌ای از رشته‌ها بین دو رشته به دست آورید. رفتارش با بعضی رشته‌ها ممکن است کمی غیرمنتظره باشد، پس با احتیاط از آن استفاده کنید.

"aa".."az".to_a # => ["aa", "ab", "ac", ..., "az"]

اشیای سفارشی در بازه‌ها

Advanced

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>
ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود

بازه را یاد بگیرید