Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Ruby Ranges:どのように機能しますか?

Rubyの範囲とは何ですか?どのように機能しますか?

範囲は、開始値と終了値を持つオブジェクトであり、これら2つの値の間の範囲全体にまたがるシーケンスを作成するのに役立ちます。

1から行くことができます 20へ 、または "a"から "z"へ 。

この記事では、次のことを発見します

  • Ruby範囲を作成する方法
  • stepの使用方法 & include? Rubyのメソッド
  • 範囲が内部でどのように機能するか

やってみましょう!

範囲を理解する

念のため、Rubyの範囲の構文は次のようになります。

(1..20)

Rangeを定義するために括弧は必要ありません 。

ただし、範囲内のメソッドを呼び出したい場合は、それらが必要になります。それ以外の場合は、範囲自体ではなく、範囲の2番目の要素でメソッドを呼び出しています。

範囲 クラスにはEnumerableが含まれているため、範囲を配列に変換しなくても、すべての強力な反復メソッドを取得できます。

ルビーステップ法

範囲 stepのようないくつかの便利なメソッドがあります メソッド。

(10..20).step(2).to_a
# [10, 12, 14, 16, 18, 20]

このメソッドを使用すると、 nの増分で範囲を反復処理できます。 、ここで n stepに渡される引数です 。

数値が範囲内にあるかどうかを確認する方法

その他の範囲 注意すべき方法は次のとおりです。cover? include?

彼らが同じことをしていると考えるのは間違いです。なぜなら彼らはそうではないからです。

include? メソッドは期待どおりの動作をします。範囲内に含まれているかどうかを確認してください。したがって、 Rangeを拡張するのと同じです。 Arrayに そこに何かがあるかどうかを確認します。

しかし、 cover? 違います。範囲の初期値と終了値を確認するだけです。 ( begin <=obj <=end )、予期しない結果が生じる可能性があります。

('a'..'z').include? "cc" # false
('a'..'z').cover? "cc"   # true

cover? 例は次と同等です:

"a" <= "cc" && "cc" <= "z"

これがtrueを返す理由 文字列は文字ごとに比較されます 。 「a」は「c」の前にあるため、最初の「c」の後に続く文字は関係ありません。

Rubyでの範囲の実装方法

範囲は数字と文字に限定されません。次のメソッドを実装している限り、任意のオブジェクトを使用できます。 <=> およびsucc

たとえば、DateTimeの範囲は次のとおりです。

require 'time'

t1 = DateTime.new
t2 = DateTime.new + 30

next_30_days = t1..t2

# Example use
next_30_days.select(&:friday?).map(&:day)

では、これはどのように機能しますか?この実装を見てみましょう:

def range(a, b)
  # if the first element is bigger than the second
  # then this isn't a sequential range
  return [] if a > b

  out = []

  # advance until the 2nd element is the same
  # as the first one
  while a != b
    out << a
    a = a.next
  end

  # add last element (inclusive range)
  # this also returns the results via implicit return
  out << a
end

p range 1, 10
p range 'a', 'z'

何が起こっているのかを理解するのに役立つコメントをいくつか追加しました。

アイデアは、最初のオブジェクトで次のメソッドを2番目のオブジェクトと等しくなるまで呼び出し続けるというもので、最終的にはそれらが満たされると想定されています。

カスタムクラス範囲

ほとんどの場合、数値と文字の範囲を使用しますが、カスタムクラスで範囲を使用する方法を知っておくとよいでしょう。

class LetterMultiplier
  attr_reader :count

  include Comparable

  def initialize(letter, count)
    @letter = letter
    @count  = count
  end

  def succ
    self.class.new(@letter, @count + 1)
  end

  def <=>(other)
    count <=> other.count
  end
end

a = LetterMultiplier.new('w', 2)
b = LetterMultiplier.new('w', 8)

# Print array with all the items in the range
p Array(a..b)

ここで重要なのは、 <=>を確実に実装することです。 & success メソッドを正しく。

include?を使用する場合 Compareableを含める必要があるメソッド モジュール。==のようなメソッドを追加します 、< 、および> (すべて <=>の結果に基づいています メソッド)。

結論

この記事では、Rubyで範囲がどのように機能するかを学習したため、範囲をよりよく理解し、範囲操作をサポートする独自のオブジェクトを実装できます。

次の投稿を見逃さないように、以下のニュースレターを購読することを忘れないでください🙂


  1. RubyでStructとOpenStructを使用する方法

    Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら2つの値を一緒に格納するた

  2. Spotify プレイリストを共同作業にする方法とその仕組み

    Spotify を使用していて、音楽の好みが高い場合は、アカウントからいつでも Spotify プレイリストを公開できます。このようにして、素晴らしい音楽コレクションを世界に知らせることができます。しかし、プレイリストは本当に素晴らしいものであるべきだということを知っておく必要があります。 Spotify には、プレイリストを作成する専門家がいます。それでも、独自のプレイリストを作成するコツがそれほどない場合でも、いくつかの簡単な手順でいつでも Spotify でプレイリストを共有できます。 それ以外にも、Spotify が提供するもう 1 つのユニークな機能があります。それは、共同プレイリ