[Ruby] 4th road

3.2.4 Accessing Characters and Substrings

耶,講到有趣的String了,這邊在書上有提到Ruby1.8和Ruby1.9對於String處理上面的小差異, 如果我們要存取String的子字串的話,就用「square-bracket array- index operator []吧」。其實大家應該都在別的語言上用的很習慣了,所以通常看一下Ruby對下面兩個不同版本的解釋就可以啦:
http://gist.github.com/290553.js?file=gistfile1.rb

最大的差異就是對於「單一字元」的解讀,在1.8時會回傳其ASCII碼,而在1.9時會回傳該字元(雖然我是這樣說,不過它們是各自屬於不同的Class下,在1.8,單一字元被視為Fixnum,而在1.9則被視為String,大家可以自己試試看)。

不知道之前說的單一字元的呈現如果不想用String來做的好方法還有沒有人記得?恩,就是用「?」,來看一下例子:
http://gist.github.com/290558.js?file=gistfile1.rb

上面都是如何對字串的「單一字元」做修改的例子,接下來要討論子字串了,老樣子,看例子學比較快:
http://gist.github.com/290559.js?file=gistfile1.rb

在Ruby下提供了[X,Y]的方法來讓我們存取「從第X個字元(可為負),向後抓Y長度個字元」,只是要特別小心Out-of-boundary 的問題。如果X為負則「反向從倒數第|X|個字元向後抓Y長度個字元」,很簡單吧!!?不過還有一個要注意的就是Ruby可以很彈性的依個人意識插入或是刪除字元,只要你的起始位置和長度寫好就可以了!再來個小例子吧XD
http://gist.github.com/290594.js?file=gistfile1.rb

如果你的長度Y是寫0的話,就會產生插入的效果而得到結果「HeLllo」,書上有寫出個小規則,來看一下:

If the righthand side is the empty string, this is a deletion, and if the lefthand side has zero-length, this is an insertion

所以如果右邊是Assign一個空字串,就會被視為刪除,反之如果左邊是以Y長度為0來表示的話,就視為插入!

這邊還有一個很好用的Range Object,不過因為在後面的章節會解釋的比較詳細,所以先放到後面再來說吧XD~

最後一個要講的就是我們也能利用字串來當作字串的index,如果是這樣子做的話,其回傳的值就是第一個相符合的子字串或是Nil(即Null)當沒有相符合的子字串的時候。

所以其實這個東西目前可能對我們還沒有什麼很特別的功用,不過書上也有講到,這個作法只有在當我們要取代一些子字串時會比較好用,老樣子,範例小姐請上菜:

http://gist.github.com/290625.js?file=gistfile1.rb

下面那個例子是我拿測試為什麼它while的運行狀況,結果很驚人的發現,index只印出了01也就代表說,它很精確的在一開始就找s[“l”]的位置,而不是像我預想的會以Sequential的方式來對整個String做尋找,不知道有沒有人很了解它內部真正在運作的情況是怎麼樣呢??(BTW,我的Ruby版本是1.8.6)

最後也可以用正規表達式 如 「 s[/[aeiou]/] = ‘*’ 」來做Search & Replace的動作,真是驚人!!

這節就先說到這啦,休息去XD~

Leave a Reply

Your email address will not be published. Required fields are marked *