Ruby 使用手冊

字串 Strings

Ruby 可用於處理字串與數值資料。字串會用雙引號 ("...") 或單引號 ('...') 括起。

ruby> "abc"
   "abc"
ruby> 'abc'
   "abc"

不同情況下,雙引號與單引號會有不同效果。用雙引號括起的字串可利用前導的反斜線逸出 (escape) 字元,或是使用 #{} 來計算裡面的程式。用單引號括起的字串並不執行這種行為,所顯示的就是結果。範例:

ruby> puts "a\nb\nc"
a
b
c
   nil
ruby> puts 'a\nb\n'
a\nb\nc
   nil
ruby> "\n"
   "\n"
ruby> '\n'
   "\\n"
ruby> "\001"
   "\001"
ruby> '\001'
   "\\001"
ruby> "abcd #{5*3} efg"
   "abcd 15 efg"
ruby> var = " abc "
   " abc "
ruby> "1234#{var}5678"
   "1234 abc 5678"

與 C 相比,Ruby 的字串處理更聰明又易用。例如,你可以用 + 串接 (concatenate) 字串,用 * 重複字串。

ruby> "foo" + "bar"
   "foobar"
ruby> "foo" * 2
   "foofoo"

用 C 連接字串比較困難,需要明確的記憶體管理才能實行:

char *s = malloc(strlen(s1)+strlen(s2)+1);
strcpy(s, s1);
strcat(s, s2);
/* ... */
free(s);

而使用 Ruby,我們不需要擔心字串佔用的空間, 完全擺脫記憶體管理的約束。

你可用字串完成下列事項:

串接:

ruby> word = "fo" + "o"
   "foo"

重複:

ruby> word = word * 2
   "foofoo"

提取字元(請注意,Ruby 的字元都是整數):

ruby> word[0]
   102            # 102 是 `f' 的 ASCII 碼 (編註:Ruby 1.9 之後版本,變更為回傳 f)
ruby> word[-1]
   111            # 111 是 `o' 的 ASCII 碼(編註:Ruby 1.9 之後版本,變更為回傳 o)

(負號指從字串結尾計算偏移位置,而不是從字串開頭。)

提取子字串:

ruby> herb = "parsley"
   "parsley"
ruby> herb[0,1]
   "p"
ruby> herb[-2,2]
   "ey"
ruby> herb[0..3]
   "pars"
ruby> herb[-5..-2]
   "rsle"

比對:

ruby> "foo" == "foo"
   true
ruby> "foo" == "bar"
   false

現在使用一下這些功能吧。這是一個「猜字」的謎題,可能「謎題」對以下內容有點太嚴肅了吧 ;-)

# 把程式儲存為 guess.rb
words = ['foobar', 'baz', 'quux']
secret = words[rand(3)]

print "guess?"
while guess = STDIN.gets
  guess.chop!
  if guess == secret
    puts "You win!"
    break
  else
    puts "Sorry, you lose."
  end
  print "guess?"
end
puts "The word was " + secret + "."

現在,先別太在意這個程式碼的細節。這個程式運作起來會像這樣。

% ruby guess.rb
guess?foobar
Sorry, you lose.
guess?quux
Sorry, you lose.
guess?^D
The word was baz.

(成功機率有三分之一,我應該猜的更準才是。)

Copyright (c) 2005-2008 Mark Slagell,中文翻譯 Ruby Taiwan 社群

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

A copy of the license is included in the section entitled "GNU Free Documentation License."