範圍 Range

範圍是最先讓我感受到 Ruby 神奇魔力的特殊用法,相比於其他的程式語言,這些範圍的用法真的讓一些運算上省事很多,今天就讓我們來認識一下這個特別的魔法吧!

表示方法 “..” “…”

範圍顧名思義就是表示一段區間的表示法,在 ruby 可以用 “..” 或 “…” 的方式來表示
如 1-10 我們可以用 1..10,但記得要依序印出來不可以直接就用 p 直接印出 1..10,這樣可是會只有印出”1..10”,需要先轉成陣列,所以可以搭配 to_a 方法將範圍表示的東西轉成陣列。

如果不想用 to_a 轉成陣列,還有特別的 * 可以把範圍展開,配合陣列的[ ]放在內部,也有相同的效果

注意 .. 和 … 表示的範圍不同喔,..表示頭尾都包含,…不包含尾巴
小小口訣:多一點少一點,少一點多一點

1
2
3
4
5
6
7
# 少一點多一點 (包含頭尾)
puts (1..10).to_a # 印出 1 ~ 10
# 多一點少一點 (不含尾)
puts (1...10).to_a # 印出 1 ~ 9
# * 可以展開範圍
p *1..10 # 依序印出1~10
p [*1..10] # 印出 [1,2,3,4,5,6,7,8,9,10]

哪些東西可以使用?

數值可以用感覺不稀奇,最令我覺得神奇的是英文字母 ruby 也可以透過範圍來表示呢!

1
2
3
(1..10) # 範圍 1 ~ 10
("a".."z") # 範圍 a ~ z
("A".."Z") # 範圍 A ~ Z

搭配陣列的一些方法讓我們更好做事

還記得之前提過的 map, select, reduce 之類的方法嗎? 這些都可以搭配範圍將程式碼很精簡的表示喔!

1
2
3
4
5
6
# map 對範圍內每個數值做x+1處理後回傳陣列
p [*1..10].map { |x| x+1} # [2,3,4,5,6,7,8,9,10,11]
p (1..10).to_a.map { |x| x+1} # 效果同上

# 字母也可以用大小來判斷呢,想像每個英文字母依照順序是有大小之分,越後面數值越大。 select可以挑選符合條件的元素形成陣列回傳
p ("a".."g").to_a.select { |chars| chars < "c"} # 取出小於"c" 的就會得到 ["a","b"]

甚至可以用來取出陣列中的值喔,注意數字所代表的是陣列的索引喔。

1
2
pokemon = ["皮卡丘","傑尼龜","妙蛙種子","小火龍"]
p pokemon[1..2] # ["傑尼龜","妙蛙種子"] =>取出索引1~2的元素

小小挑戰:請計算從 1 加到 100 的總和

如果大家記得之前我們提過可以使用 reduce 的方法處理陣列的加總,你應該知道這樣的問題要怎麼回答吧。

1
2
3
4
5
6
sum = (1..100).to_a.reduce{|sum, x| sum + x}
# sum = [*1..100].reduce(:+) # 這種特殊的方法更簡短,冒號後面可以套用其他運算符號(+ - x /)
puts sum # 5050

#黑魔法來了,可以用sum方法,可以直接針對範圍內的數值加總
puts (1..100).sum

了解了範圍用法之後,我們可以實際應用在很多陣列的地方喔,好好的善用 Ruby 賜與我們的神奇魔法吧!!


參考資料:

  1. 為你自己學 Ruby on rails
  2. Ruby Docs - Range