2014年10月13日 星期一

[ Ruby Gossip ] Basic : 內建型態與操作 - 範圍型態

Source From Here 
Preface 
如果使用 begin..end 或 begin...end,這會建立 Range 實例,代表指定的範圍,begin..end 表示包括 end,begin...end 表示不包括 end。例如: 
 

範圍型態 
可以使用 begin 方法得知範圍起點,使用 end 方法得知範圍指定終點,使用 exclude_end? 得知範圍是否排除終點。例如: 
>> r = 1..5
=> 1..5
>> r.begin
=> 1
>> r.end
=> 5
>> r.exclude_end?
=> false
>> r = 1...5
=> 1...5
>> r.begin
=> 1
>> r.end
=> 5
>> r.exclude_end?
=> true

範圍不僅可以是整數,也可以是字元或浮點數,只不過浮點數的範圍無法進行迭代。例如: 
 

可以使用 include? 方法得知範圍物件是否包括某個整數、浮點數或字元。例如: 
>> (1.0..3.0).cover? 2.1
=> true
>> (1..10).include? 3
=> true
>> (1..10).include? 0
=> false
>> (1.0..3.0).include? 2.1
=> true
>> (1.0..3.0).include? 3.1
=> false
>> ("a".."g").include? "e"
=> true
>> ("a".."g").include? "x"
=> false

也可以使用 cover? 測試物件是否在指定的 begin 與 end 之間。例如: 
>> (1..10).cover? 3
=> true
>> (1.0..10.0).cover? 3.0
=> true
>> ("a".."m").cover? "x"
=> false
>> ("a".."m").cover? "d"
=> true
>> ("a".."m").cover? "abcd"
=> true
>> ("a".."m").cover? "xyz"
=> false

注意,在 (begin..end).cover? var 時,為測試是否 var>=begin且var<=end(如果是begin...end,則是var),所以 ("a".."m").cover? "abcd" 時,是測試 "abcd">="a" 且 "abcd"<="m"。在介紹 字串型態陣列型態 時,談到 [n..m] 與 [n...m] 的索引方式,事實上,[] 中的 n..m 與 n...m 建立了 Range 實例。例如: 
>> r = 2..5
=> 2..5
>> [1, 2, 3, 4, 5, 6, 7][r]
=> [3, 4, 5, 6]
>> "This is a test"[r]
=> "is i"

建立 Range 時,end 小於 begin,通常為應用於字串與陣列的特例。例如: 
>> r = 3..-1
=> 3..-1
>> [1, 2, 3, 4, 5, 6, 7][r]
=> [4, 5, 6, 7]
>> "This is a test"[r]
=> "s is a test"

可以使用 to_a 將範圍轉為陣列,不過浮點數範圍不適用,範圍的end小於begin時,會得到空陣列。例如: 
 

Supplement 
Tutorialpoints - Ruby Ranges 
Ranges occur everywhere: January to December, 0 to 9, lines 50 through 67, and so on. Ruby supports ranges and allows us to use ranges in a variety of ways:
- Ranges as Sequences
- Ranges as Conditions
- Ranges as Intervals

rubylearning.com - Ranges in Ruby

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...