程式扎記: [ Ruby Gossip ] Basic : 內建型態與操作 - 字串型態

標籤

2014年10月6日 星期一

[ Ruby Gossip ] Basic : 內建型態與操作 - 字串型態

Source From Here 
Preface 
在 Ruby 中要表示字串,看似可以使用雙引號或單引號來包括字元序列,字串是 String 類別的實例。例如: 
 

注意'Just"in'時,實際上相當於"Just\"in",\" 表示忽略(Escape)字元,因為"被用來作為括住字串的表示法,如果要在字串中表示",就必須寫為\",直譯器看到\會忽略下一個字元,不作為語法的一部份。另外還有一些常用的忽略字元表示: 
 

實際上Ruby中的字串,應該都是使用雙引號括住,單引號括住的字串,實際上是讓你不用撰寫\\、\"忽略字元,就可以代表\、"的簡便方式。例如: 
>> 'Just\in'
=> "Just\\in"
>> print 'Just\in'
Just\in=> nil
>> 'Just"in'
=> "Just\"in"
>> print 'Just"in'
Just"in=> nil

如上所示,如果你想顯示Just\in的結果,使用'Just\in',實際會被轉換為"Just\\in",如果你想顯示Just"in,使用'Just"in',實際會被轉換為"Just\"in",也因此,在單引號中,除了\\與\'之外,撰寫其它忽略字元都會被當作原始字串(Raw string)。 

More About String: 
雙引號字串中若包括 #{},則 #{} 中的內容會被當作程式解釋。例如: 
>> name = "John"
=> "John"
>> "My name is #{name}"
=> "My name is John"
>> "My name is #{1+1}"
=> "My name is 2"
>> "#{def hello; puts 'hello'; end; hello}"
hello
=> ""

被單引號括住的字串,不會對 #{} 中的內容解譯。 

如果想建立的字串中,同時要含有雙引號與單引號,可以使用 %Q 或 %q 比較方便,%Q 相當於建立雙引號字串,%q 相當於建立單引號字串。%Q 與 %q 搭配 {、} 或 |、| 都可以。例如: 
>> %Q{"test" and 'test'}
=> "\"test\" and 'test'"
>> %q{"test" and 'test'}
=> "\"test\" and 'test'"
>> %Q|"test" and 'test'|
=> "\"test\" and 'test'"
>> %q|"test" and 'test'|
=> "\"test\" and 'test'"
>> name = "Monica"
=> "Monica"
>> %Q{My name is #{name}}
=> "My name is Monica"
>> %q{My name is #{name}}
=> "My name is \#{name}"

撰寫字串時,可以在雙或單引號中直接Enter換行,字串會自動加上\n,如果包括縮排用的空白,空白也會是最後字串的一部份。例如: 
>> "This is
a test. This is
a test!"

=> "This is\n a test. This is \n a test!"

如果你想知道字串的字元長度,則可以使用 length 方法(自 Ruby 1.9.2 開始)。例如: 
>> "Justin".length
=> 6

如果想要逐一取得字元,可以使用 each_char 方法: 
>> "Justin".each_char do |c|
?> print c, "-"
>> end
J-u-s-t-i-n-=> "Justin"

或者是使用 include? 方法測試是否包括某些字串: 
>> "Justin".include? "Just"
=> true

可以使用 + 操作來串接字串,使用 * 可以重複字串: 
>> text1 = "Just"
=> "Just"
>> text2 = "in"
=> "in"
>> text1 + text2
=> "Justin"
>> text1 * 10
=> "JustJustJustJustJustJustJustJustJustJust"

在強弱型別的光譜中,Ruby 比較偏強型別,型態較不能自行轉換,例如 Ruby 中,不能混合字串與數字進行+運算,你得自己使用 to_s 方法,將數字轉為字串,才可以進行字串串接: 
>> "score: " + 90
TypeError: can't convert Fixnum into String
from (irb):13:in `+'
from (irb):13
from C:/Winware/Ruby192/bin/irb:12:in `
'

>> "score: " + 90.to_s
=> "score: 90"

+ 實際會產生新的字串,不過在Ruby中,字串是可變動的(Immutable),例如可使用 << 在原字串後附加字串: 
>> text1 = "Just"
=> "Just"
>> text1 << "in"
=> "Justin"
>> text1
=> "Justin"

如果你想知道某個字元的編碼,則可以使用 ord 方法,使用 chr 方法則可以將指定編碼轉換為字元: 
>> "A".ord
=> 65
>> 65.chr
=> "A"

字串是由字元序列所組成,如果你想要取得字串中某個字元,則可以使用 [] 指定索引,索引從 0 開始。例如: 
>> name = "John"
=> "John"
>> name[0]
=> 74
>> name[0].chr
=> "J"
>> name[1].chr
=> "o"
>> name[-1].chr
=> "n"

Ruby中的索引,不僅可指定正值,還可以指定負值,實際上了解索引意義的開發人員,都知道索引其實就是相對第一個元素的偏移值,在Ruby中,正值索引就是指正偏移值,負值索引就是負偏移值,也就是 -1 索引就是倒數第一個元素,-2 索引就是倒數第二個元素. 

[] 操作還可以進行切片(Slice)運算。例如: 
>> name
=> "John"
>> name[0..2]
=> "Joh"
>> name[0...2]
=> "Jo"
>> name[1..-1]
=> "ohn"
>> name[-3..-2]
=> "oh"
>> name[0, 3]
=> "Joh"

[n..m] 是指定起始索引與結束索引,且包括結束索引,以取得子字串,[n...m] 是指定起始索引與結束索引,但不包括結束索引(實際上n..m或n...m建立了 Range 實例,之後會再說明),[n,length] 是指定起始索引與長度以取得子字串,由於可指定負值,因此 name[0, 3] 就相當於指定 name[0..2]

先前談過,Ruby 中的字串是可以變動的,你也可以使用 [] 指定索引變動字串內容: 
 

[n..m]、[n...m] 或 [n, length] 右邊接上=,表示作取代的動作,如果指定了 [n..0]、[n...0]或[n, 0],則是技巧性地作了安插的動作。 

如果想要取代字串,也可以使用 [] 時指定被取代字串。例如: 
>> slogan = "I love Java, Javascript"
=> "I love Java, Javascript"
>> slogan["Java"] = "Ruby"
=> "Ruby"
>> slogan
=> "I love Ruby, Javascript"
>> slogan["love"] = "am learning"
=> "am learning"
>> slogan
=> "I am learning Ruby, Javascript"

如果想要反轉字串,可以使用 reverse 方法,這會傳回新字串,內容為原字串反轉後的結果,如果使用 reverse! 方法,則會在原字串上反轉: 
>> name
=> "Java"
>> name2 = name.reverse
=> "avaJ"
>> name
=> "Java"
>> name2
=> "avaJ"
>> name.reverse!
=> "avaJ"
>> name
=> "avaJ"

在 Ruby 的慣例中,如果同時提供有 name 與 name! 兩種方法,有 ! 結尾的方法代表著要注意它與無 ! 方法有所不同。例如,字串上沒 ! 的方法表示以新字串傳回結果,有 ! 的方法表示會修改原字串,像是轉大寫就有 upcase 與 upcase! 方法,轉小寫會有 downcase 與 downcase! 方法,裁剪字串前後空白的 chomp 與 chomp! 等方法。 

Ruby 慣例中,有提供!的方法,就會有提供對應的無 ! 方法。例如,有 abc! 方法,慣例上就會有個 abc 方法,不會只單獨定義一個 cde! 方法,而沒有對應的 cde 方法。有經驗的Ruby程式開發人員,看到 xyz!,就會去思考它與 xyz 方法有什麼不同。 

Supplement 
Ruby 手冊 - 字串

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!