鐵 人
Ruby女孩(7):原來字串也可以比大小?
2014.Oct.07

延續昨天字串雞屁股(昨天的留言XD)的內容,昨天主要說明單引號與雙引號的字串,今天會說明 加上倒引號的字串 意義,以及字串的 運算存取字符 方式。

加上倒引號的字串

'字串'"字串"(倒引號)字串(倒引號)

今天要來講第三種,在字串前後加上倒引號『 ` 』(通常在鍵盤的ESC下方那個按鍵),是用於命令的執行,節錄書中一段(p.55):

『當文字被倒引號( ` )括住時,該文字會被視為一個夾上雙引號( " )的字串實字。該實字會被傳遞給一個名為 Kernel. 的方法。此方法會將該文字當成作業系統的一個shell 命令來執行,並且將命令的輸出當成一個字串傳回。』

例如:我們在終端機中,如欲看資料夾下的檔案,在Unix 系統我們會打 ls,在Windows 系統我們會打 dir。這些效果等同於用Ruby 寫(倒引號)ls(倒引號)(倒引號)dir(倒引號),請看下圖:

終端機下ls的例子

請看三個紅色框框的部分,原本終端機上我直接打 ls,可以列出資料夾下的檔案,而當我進入 irb (interactive Ruby) [註1] 模式時,我打 (倒引號)ls(倒引號),執行結果一樣將該目錄底下的資料夾列出來,並且是以字串的模式顯示。另外,如同單引號與雙引號有相對應的 %q%Q (詳情請看昨天的文章),倒引號也有相對應的 %x 可使用,效果完全相同。

[註1] irb(interactive Ruby)是一種Ruby shell,有安裝Ruby 就可以直接在自己終端機進入irb 模式,並鍵入任何Ruby 的運算式。

字串的運算

先來認識兩個字串的運算符:『 + 』、『 « 』,直接看例子比較好懂:

"國父" + "  " + "孫中山先生"  
  
=> "國父  孫中山先生"  
  
"國父" << "  " << "孫中山先生"  
  
=> "國父  孫中山先生"  

看起來兩個運算符的結果一模一樣,都是把字串接在一起了,但有一個很大的差異是:

  • + 在接完字串之後,會回傳一個新的字串物件!

  • << 是直接更改最左邊的字串,而不會回傳一個新的物件!

接著再看 * 運算符:

"我愛Ruby" * 3  
  
=> "我愛Ruby我愛Ruby我愛Ruby"  
  
3 * "我愛Ruby"  
  
TypeError: String can't be coerced into Fixnum  

可以知道字串可以乘三遍,但顛倒過來就會報錯!(真的跟日常生活的乘法是一樣的哈哈哈)

數字可以比大小:

3>2  
=> true  
  
-3>-2  
=> false  

字串也可以比大小!

"R">"U"  
=> false  
  
"B">"Y"  
=> false  
  
"Ruby">"RUBY"  
=> true  

咦?這個結果是怎麼回事XD 書中提到這其實是跟ASCII 編碼有關,所有大寫字母的編碼都比小寫字母小,在前面的連結中,我們可以看到,R 的編碼為52,U 的編碼為55,所以"R">"U"是錯的,依此類推。

存取字符與子字符

『String 所支援的運算符中最重要的或許是方括號陣列索引運算符 [] ,此運算符可用於提取或修改字串中的特定部分。』

a = "我愛Ruby!"  
a[0] #=> "我" 第一個字  
a[1] #=> "愛"  
a[2] #=> "R"  
a[-1] #=> "!" 倒數第一個字  
a[-2] #=> "y"  
a[-7] #=> "我"  
a[-8] #=> nil 找不到這個字  
  
a[2,4] #=> "Ruby" 第2+1個字,往右數總共要4個字  
a[2,4] = "Python" #取代為Python XD  
a => "我愛Python!"  

所有字串開頭都是第0個數,往右正著數,往左負著數,如果超出範圍字串長度就會找不到這個字,取代的方法可以參考上面程式碼最後三行。


今天是Lucky 7 day!今天發現這句很發人深省!

“We cannot teach people anything. We can only help them discover it within themselves.” Galileo Galilei

我的鐵人賽的文章可能完全不能當作教學文章,但希望可以給有興趣碰Ruby 的朋友一點方向,快加入Ruby 的行列吧XD!

Ruby女孩(8):字串迭代小練習!
2014.Oct.08
Ruby女孩(6):Ruby的"-字-字-字-字-字-"
2014.Oct.06
comments powered by Disqus
Designed with by Otis Chou