しおブログ言うてますけど

技術ブログ言うてますけど技術以外のことも発信すると思われ。RubyとかRuby on Railsとか生き方とかジャンルにこだわらず自分の好きなように。初心者なのでお手柔らかに。

以外とわかっていなかったRubyにおける範囲

こんにちは。たかあきです。 Rubyでは「1から5までの数字」や「文字列"a"から文字列"d"まで」といった値の範囲を表すオブジェクト(Range)がある。
チェリー本で勉強するまではなんとなくでしかわかっていなかった範囲オブジェクトだが、伊藤大先生の解説により点と点がつながったような理解ができたのでまとめていく。

範囲オブジェクトの使い方

範囲オブジェクトの使い方自体はすごくシンプルである。

最初の値..最後の値(最後の値を含む)
最初の値...最後の値(最後の値を含まない)

ここで重要になってくるのが、最後の値を含むか最後の値を含まないということである。
これがまず自分ではわかったなかった。
適当に..をつけたら範囲が指定されると思っていたが、最後の値を含む含まないかで範囲の指定の仕方が変わる。

# ..を使うと範囲に含まれる(1以上55以下)
point = (1..55)
point.include(0)
#=> false
point.include(55)
#=> true
# ...を使うと範囲に含まれない(1以上55未満)
point = (1...55)
point.include?(55)
#=> false

繰り返しを使った応用

範囲オブジェクトに対してto_aメソッドを呼び出すと値が連続する配列を作成するこることができる

 例
(1..5).to_a  #=> [1, 2, 3, 4, 5]
(1...5).to_a  #=> [1, 2, 3, 4]

数字だけでなく文字列の配列も作成することができる

例
alf = ('a'..'z').to_a  #=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
fruits = ('apple'..'applz').to_a  #=>  ["apple", "applf", "applg", "applh", "appli", "applj", "applk", "appll", "applm", "appln", "applo", "applp", "applq", "applr", "appls", "applt", "applu", "applv", "applw", "applx", "apply", "applz"]

このように文字列もアルファベットに沿った連続した配列が作成された。
ここである疑問が生まれた。

「数字の場合、1〜5のように1づつ増える配列は作成されるけど3〜1のような小さくなる場合はどうなるん?」
「文字列の場合、文字列の語尾がe〜zのようになると配列は作成されるけどzからaにするとどうなる?」

気になったので試して見た。

# 数字55から1まで連続した配列は作成されるのか
age = (55..1).to_a
age #=> []

このように空の配列になってしまった。

# 文字列がz〜a反対になったら配列は作成されるのか
alf = ('z'..'a').to_a
alf #=> []

こちらも空の配列になってしまった。

まとめ

Rubyにおける範囲(Range)オブジェクトは最初の値..最後の値(最後の値を含む)最初の値... 最後の値(最後の値を含まない) という風に使う。 範囲オブジェクトに対して.to_aをメソッドを呼び出すと連続した配列を作成することができる。
55〜1や'a'〜'z'といった逆の配列は作成されない。