E.J. BLOG

Archive for January, 2010

[Ruby] 5th street

leave a comment

因為CH.3後面在討論編碼的問題,不過暫時對我來說可能還用不到,不過時間有限,就來到了下一段。

3.3 Arrays

Ruby的Array類別提供了一些有趣的Method,常用的如size(同length),可以用直接回傳Array的長度。基本的東西大概都和別的語言一樣,唯一一個要注意的就是它對Out-of-bound的處理是回傳一nil,但通常別人都是直接Error了,所以可以為這種狀況做一些判斷,真是貼心呀。

來看一下Array要怎麼用:

再上語法甜點:

看完例子大概就很清楚要怎麼操作它了XD,而index的操作就請看前面幾篇,概念是一樣的,所以應該很好上手。

當然也要提幾個好用的東西,像是可以用「+」把兩個Array給串接起來,反之也可以用「-」把Array相符合的元素給刪除掉,來看個實際的Demo:

水哦,還記得之前String的「<<」運算子嗎,你應該會想說,該不會在Array也可以用吧,沒錯,還真的可以用,來看看運行的情況:

和String好像,了解一個就會這個了XD

這邊有個很有趣的就是,它也把布林運算子「&」、「|」都拿來玩了,它們是用來比較兩個Array間元素的狀況用的,廢話不多說,再來個例子:

簡單來說,「|」就是「聯集」,而「&」就是「交集」。交集就是找出A、B兩個集合間共有的元素,而聯集就是找出A、B兩個集合的所有元素。但是在Ruby內還多了一個限制,這兩個布林運算所回傳的的結果並不會有重覆的情況(不會有[1,1 …] 這種情形)。最後,也是要特別注意的,就是Array下的這種布林運算並沒有Transitive(遞移性),即「A|B」≠「B|A」,看例子就發現其順序會相反,這要留意一下呀!!

看了這麼多例子,先來去試試看比較實在啦,文末附上Array可用的Method:

我們下篇見XD~

Written by EragonJ

January 31st, 2010 at 11:47 pm

Posted in Ruby

Tagged with , , ,

[Ruby] 4th road

leave a comment

3.2.4 Accessing Characters and Substrings

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

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

不知道之前說的單一字元的呈現如果不想用String來做的好方法還有沒有人記得?恩,就是用「?」,來看一下例子:

上面都是如何對字串的「單一字元」做修改的例子,接下來要討論子字串了,老樣子,看例子學比較快:

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

如果你的長度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)當沒有相符合的子字串的時候。

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

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

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

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

Written by EragonJ

January 30th, 2010 at 11:41 pm

Posted in Ruby

Tagged with , , ,

[Ruby] 3rd Game

leave a comment

3.2.1.6 Backtick command execution

哦耶,要來講Backtick了,就是「`」這個符號,這在很多語言上面都是用來執行外部指令,這個指令真的是很方便,特別是要呼叫一些系統指令來做事的話,這個東西就一定可以幫上很多忙。

來個書上的例子:

在這我們就可以自己去控制windows這個變數,如果是True的話就代表是在W$下執行這段程式,所以listcmd就要選擇dir,反之則用ls,真是幾行Code就把他用到出神入化XD!!而如果要在String內解析變數的話,就要用#{變數名稱}的方法,這個可能之後會很常用。

3.2.1.7 String literals and mutability

先來段原文:

Each time Ruby encounters a string literal, it creates a new object. If
you include a literal within the body of a loop, Ruby will create a new object for each
iteration.

大意是說,如果是用「字面」的方式去操作一個String的物件的話,在Ruby下會被視為不用的物件,請看下面的例子:

恩哼,還蠻清楚的吧,我們利用times這個Method來做個實驗,發現他們各自是不同的物件,但是直覺上可能會認為是同一個,所以要避免這種做法。

3.2.1.8 The String.new method

所以我們可以用new這個method去產生個別的物件… 結束了。

其實怎麼用還是看人啦,OO玩到走火入魔的人大概會用String.new(“test”)吧,但是如果是像我這種懶人,只要避免Loop的情況,其他的就讓直譯器幫我判斷吧XD。

3.2.2 Character Literals

哦耶,一直用String真的有點煩,如果只是想要表示一個字元也來個Sring這樣不會太超過嗎??有點殺雞用屠龍刀的感覺,所以在Ruby又貼心的提供了一個方便的小東西叫「字元字面」(好鳥的名字,記英文就好啦)

我查了一下,這類的變數是屬於「Fixnum」這個類別下的,所以它是以數字的方式來儲存這類的變數(見上例)。

3.2.3 String Operators

在String Class內提供了兩種method,一個叫「<<」、一個叫「+」,來看一下官方的解釋:

1st 「<<」 Append---Concatenates the given object to _str_ 2nd「+」 Concatenation---Returns a new +String+ containing _other_str_ concatenated to _str_.

看完了解釋,可以了解到它們都是做了串接的效果,可以把兩個String的物件串接在一起,只是不同的用法而已,來看下面的例子了解一下:

很簡單吧XD~我這個白痴都看的懂了。

先寫到這,其他的再慢慢更新。

Written by EragonJ

January 30th, 2010 at 12:44 am

Posted in Ruby

Tagged with , , ,