EragonJ – A humble navigator

About EragonJ | About this blog

Archive for the ‘Ruby’ tag

[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 , , ,

[Ruby] 2nd round

leave a comment

之前忘了說明一下變數型態,下面是一個我提供的例子:

可以知道Ruby是一種Dynamically Typed Language(和PHP一樣XD),所以在例中,只是Assign的值不同,但是Ruby卻會有不同的解釋(一個是Fixnum類別,另一個是String類別)

2.1.4.3 Punctuation in identifiers
下面這段是書上對於Variable Scope的範例:

說實在的那樣寫對我這個白痴來說真的是很難理解,所以我又找到另外一個詳細的解說版本如下:

是不是清楚許多了呀?最後在這邊再以一個小例子來收個尾:

你這邊一定會說「媽呀,你根本就沒說到Instance variable和Class variables也想打混過去!!」,好吧,你都這樣說了,那我只好再想些例子來滿足你,先看看定義吧:

A class variable is a variable that is shared amongst all instances of a class. This means that only one variable value exists for all objects instantiated from this class. This means that if one object instance changes the value of the variable, that new value will essentially change for all other object instances.

Instance variables are similar to Class variables except that their values are local to specific instances of an object. For example if a class contains an instance variable called @total, if one instance of the object changes the current value of @total the change is local to only the object that made the change. Other objects of the same class have their own local copies of the variable which are independent of changes made in any other objects.

這邊就簡單的翻譯一下它的意思:

Class Variables(類別變數)就是一種可以在同一個類別下的實體物件間互相分享的一種變數,當有一個實體改變了它的值,另一個實體也會存取到被改變後的值。

而Instance Variables(實體變數)則是個別存在於各實體物件下,各自維護自己的實體變數,而不會互相產生衝突。

我知道大家一定不想看英文,我自己翻得也很爛XD,所以我自己用了一個智障簡報來講解一下,看看就好,別太在意,只是想讓大家笑一下XD

(SlideShare真是難看,用Keynote看才可以看到動畫說,我轉了一個Mov檔在下面!)
P.S.原本要直接Embed在文章裡面,不過Hax4.in有點慢…

點我看影片



大概就是這個意思啦,只是簡單解釋一下,反正之後用Code來說明會比較好了解。

參考:Click Me

Written by EragonJ

January 29th, 2010 at 5:21 pm

Posted in Ruby

Tagged with , ,

[Ruby] Get started

leave a comment

最近因為一些實務上的需求(真的嗎),所以不得不試著嘗試用RoR來開發程式,但是因為萬事起頭難,最困難的就是在一開始,所以就先試著了解Ruby這個語言的特性,再來往下階段做開發。

因為說實在的,不知道為什麼國內Ruby相關的資源很少,在網路上都沒有找到什麼比較淺顯易懂的書,所以就隨性上網找到了一本名為「The Ruby Programming Language」的書,就拿它來當cookbook吧。

因為我是從PHP跑來這邊玩沙,所以說實在的我還真的有點很不習慣,先看一下PHP在Wiki上的介紹:

『PHP 原本的簡稱為 Personal Home Page[4],是Rasmus Lerdorf 為了要維護個人網頁,而用c語言開發的一些CGI工具程式集,來取代原先使用的 Perl 程式。最初這些工具程式用來顯示 Rasmus Lerdorf 的個人履歷,以及統計網頁流量[5]。他將這些程式和一些表單直譯器整合起來,稱為 PHP/FI。』– From Wiki

PHP當初是延用了C的風格,再加上一些自有的特色,使得其多了一些較彈性的設計(如使用變數時可以不需要宣告型態)。但是,當我看到Ruby之後,反而讓我有種很難上手的感覺,因為它好精簡,讓我有種當初在寫Perl的感覺(雖然我沒有寫好,對不起c9s XD)。

好啦,廢話不多說,現在就來看看我看這本書時的一些小重點。

3.2.1.4 Arbitrary delimiters for string literals

還記得剛剛為什麼我說它讓我覺得好像Perl嗎,因為它也有支援Syntax Sugar,來看看它是怎麼做到的:

還真的是很簡單,只要在前面要加個”%”就可以了(Perl 只要 q就好了呀!!!)

下面還說到要怎麼在使用Syntax Sugar時再跳脫那些用來當標記的符號,我覺得如果真的還要這樣子就有點本末倒置了吧…

3.2.1.5 Here documents

這邊再把上面的Syntax Sugar做個延伸,是借用Unix shell的語法,叫做 Here documents,它後面的註解很有趣,它說「因為這個文件就在個原始碼內,而不是存在於外部的檔案」,真是有夠白痴,有講和沒講不是一樣XD。

來看個小Example。

“<<"和"<<-"的差別就差在後者的close tag的前面可以有空白,但是前者的不行,就這樣子而已。還有個特別強調的地方,就是close tag的後面不能插入comment,插了就會出現一堆錯誤!!這個東西在PHP也有,通常是用來存放HTML的部分,這樣就不用一直一行一行的輸出,算是把View分離的方法,範例如下。

1st part 就覺牛刀小試一下到這邊啦。

Written by EragonJ

January 28th, 2010 at 11:24 pm

Posted in Ruby

Tagged with , , , ,