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で範囲がどのように機能するかを学習したため、範囲をよりよく理解し、範囲操作をサポートする独自のオブジェクトを実装できます。
次の投稿を見逃さないように、以下のニュースレターを購読することを忘れないでください🙂
-
RubyでStructとOpenStructを使用する方法
Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら2つの値を一緒に格納するた
-
Spotify プレイリストを共同作業にする方法とその仕組み
Spotify を使用していて、音楽の好みが高い場合は、アカウントからいつでも Spotify プレイリストを公開できます。このようにして、素晴らしい音楽コレクションを世界に知らせることができます。しかし、プレイリストは本当に素晴らしいものであるべきだということを知っておく必要があります。 Spotify には、プレイリストを作成する専門家がいます。それでも、独自のプレイリストを作成するコツがそれほどない場合でも、いくつかの簡単な手順でいつでも Spotify でプレイリストを共有できます。 それ以外にも、Spotify が提供するもう 1 つのユニークな機能があります。それは、共同プレイリ