1. 程式人生 > >2.3 ruby的資料型別--字串(String)、區間(Range)

2.3 ruby的資料型別--字串(String)、區間(Range)

1、字串(String)

字串是String類的物件。分為單引號字串和雙引號字串。雙引號字串能支援較多的轉義字元以及支援字串#{}q嵌入變數。實際開發中多用雙引號字串。

(1)字串嵌入變數用#{ },這個是ruby特有的,經常使用的一個功能。只支援雙引號的字串。
irb(main):013:0> name = "Mary"
=> "Mary"
irb(main):014:0> puts "你好,我是#{name}"
你好,我是Mary

#{ }裡面不僅可以放變數,還可以放表示式。輸出結果會顯示錶達式的結果

irb(main):016:0> x = 1
=> 1 irb(main):017:0> y = 2 => 2 irb(main):018:0> puts "x加y等於#{x+y}" x加y等於3

2、型別轉換

(1)數字轉字串:to_s
irb(main):019:0> 1.2.to_s
=> "1.2"
(2)字串轉整型:to_i,只會保留字串裡面數字的整數部分
irb(main):021:0> "1.2".to_i
=> 1
irb(main):022:0> "1.2你好,世界".to_i
=> 1
(3)字串轉浮點型:to_f,如果字串的開頭為數字,則轉換後的值為字串開頭的數字。如果字串的開頭不是數字,則轉換後的值為0.0
irb(main):023:0> "1.2".to_f
=> 1.2
irb(main):024:0> "1.2abc5.6".to_f
=> 1.2
irb(main):025:0> "abc5.6".to_f
=> 0.0
(4)字串轉分子式:to_r
irb(main):026:0> "200/2".to_r
=> (100/1)
irb(main):027:0> "1.2".to_r
=> (6/5)
irb(main):028:0> "12345".to_r
=> (12345/1)
irb(main):029:0> "-9.2e2".to_r
=
> (-920/1)
(5)字串轉符號:to_sym。符號也是ruby資料型別的一種,後面會單獨介紹
irb(main):030:0> "hello".to_sym
=> :hello

3、操作字串

(1)str % arg 格式化輸出。

不同型別佔位符如下所示:

佔位符 代表型別
%d 整數
%f 浮點數
%s 字串
irb(main):041:0> age = 22
=> 22
irb(main):042:0> name = "Mary"
=> "Mary"
irb(main):043:0> salary = "8000.78"
=> "8000.787"
#%s給name字串佔位,%d給age整數佔位,%f給salary浮點數佔位
irb(main):044:0> puts "my name is %s, my age is %d, my salary is %f" % [name,age,salary]
=>my name is Mary, my age is 22, my salary is 8000.787000

當然如果僅僅是將變數顯示在字串裡面的話,咱們還是用字串內嵌#{}功能比較好,但是我們想要將這些變數進行一些處理再顯示,用佔位符就比較方便了。比如想要在name後面加7個空格,age前面加5個空格,salary保留兩位小數,可以像下面這樣寫

puts "my name is %-7s, my age is %5d, my salary is %.2f" % [name,age,salary]
=>my name is Mary   , my age is    22, my salary is 8000.78

佔位符比較常用的功能就是限制數字的小數位數,在專案中會經常用到

irb(main):049:0> num = 12345.678
=> 12345.678
irb(main):050:0> "%.1f" % num
=> "12345.7"
(2)str * num 字串乘以一個整數,會得到num個str
irb(main):052:0> "str"*3
=> "strstrstr"
irb(main):053:0> "str"*0
=> ""
(3)str + str1 兩個字串相加,相當於拼接兩個字串。

值得注意的是,如果要拼接數字的話,需要將數字轉換成字串(to_s方法),再做拼接

irb(main):057:0> age = 22
=> 22
irb(main):058:0> name = "Mary"
=> "Mary"
irb(main):059:0> puts "I am " + name + " my age is " + age.to_s
I am Mary my age is 22
(4)== 判斷兩個字串是否相等,相等返回true,否則返回false
(5)str.length 獲取字串的長度。中文字元的長度和英文字元一樣,都是1。
irb(main):060:0> "Hello".length
=> 5
irb(main):061:0> "我愛我家".length
=> 4
(6)通過索引擷取字串,索引從0開始
  • str[n] 取索引數為n的字元,索引從0開始數
  • str[n, length] 從索引數為n的字元開始,取length個字元
  • str[start…end] 取索引數為start到end之間的值,包含索引為end的字元,涉及到範圍(Range)知識點,先了解,後面會講
  • str[start…end] 取索引數為start到end之間的值,不包含索引為end的字元
irb(main):062:0> str = "HelloWorld"
=> "HelloWorld"
#索引0,代表第一個字元,為H
irb(main):063:0> str[0]
=> "H"
irb(main):064:0> str[1]
=> "e"
#從索引為2的字元開始(即第3個字元),取3個字元
irb(main):066:0> str[2,5]
=> "lloWo"
#從索引為2的字元開始,到索引為5的字元,包含索引為5的字元
irb(main):067:0> str[2..5]
=> "lloW"
#從索引為2的字元開始,到索引為5的字元,不包含索引為5的字元
irb(main):068:0> str[2...5]
=> "llo"
(7)str.capitalize和 str.capitalize! 將str的第一個字元轉換成大寫,其他字元轉換成小寫。

capitalize和capitalize!的區別是:
capitalize不改變str的值,只是返回值為首字母為大寫的字元
capitalize!會改變str的值,並且返回首字母為大寫的字元

irb(main):069:0> a = "HELLO"
=> "HELLO"
irb(main):070:0> a.capitalize
=> "Hello"
irb(main):071:0> a
#a還是原先的值
=> "HELLO"
irb(main):072:0> a.capitalize!
=> "Hello"
irb(main):073:0> a
#a的值已經改變了
=> "Hello"
(8)str.chars 返回組成str的字元的陣列形式
irb(main):074:0> "Hello".chars
=> ["H", "e", "l", "l", "o"]
(9)str.delete(str1,…) 刪除掉str和str1相同的部分。如果括號裡面有多個引數,則這多個引數的交集會被刪除。delete!和delete之間的區別和前面一樣,方法後面加歎號,會改變字串本身。
irb(main):075:0> "Hello".delete("l")
=> "Heo"
#"l"和"H"沒有交集的部分,所以不會刪除任何字元
irb(main):076:0> "Hello".delete("l","H")
=> "Hello"
#"Hl","He"的交集部分為"H",所以會刪掉"H"字元
irb(main):077:0> "Hello".delete("Hl","He")
=> "ello"
(10)str.downcase 將str的字元全部轉換為小寫
(11)str.upcase 將str的字元全部轉換為大寫
irb(main):081:0> str = "HEllo"
=> "HEllo"
irb(main):082:0> str.downcase
=> "hello"
irb(main):083:0> str.upcase
=> "HELLO"
(12)str.end_with?(str1,…) 判斷str是否以str1等引數中的任意一個結尾,是的話,返回true,否則的話為false
(13)str.start_with?(str1,…),判斷str是否以str1等引數中的任意一個開頭,是的話,返回true,否則的話為false
irb(main):084:0> "Hello".end_with?("llo")
=> true
irb(main):085:0> "Hello".end_with?("Horizon","llo")
=> true
irb(main):086:0> "Hello".start_with?("Hel")
=> true
irb(main):087:0> "Hello".start_with?("el","lo")
=> false
(14)str.gsub(a,b),將str中的a用b代替。a可以是正則表示式,正則表示式我們之後會講
irb(main):088:0> "HelloWorld".gsub("l","o")
=> "HeoooWorod"
(15)str.include?(str1) 判斷str中是否包含str1,包含的話,返回true,不包含的話,返回false
=> "Hello,my name is Mary"
irb(main):090:0> str.include?("hel")
=> false
irb(main):091:0> str.include?("Hel")
=> true
(16)str.index(a) 返回str中a字元的索引位置,如果str中有多個a字元,則返回第一個字元所在的位置。如果str中沒有a字元,返回nil
irb(main):093:0> "Hello".index("o")
=> 4
irb(main):094:0> "Hello".index("2")
=> nil
(17)strip去除字串兩側空格
  • strip、strip! 將字串左右兩側空格去掉,不會去掉字串中間的空格
  • lstrip、lstrip! 將字串左兩側空格去掉
  • rstrip、rstrip! 將字串右兩側空格去掉
irb(main):097:0> str.strip
=> "h  e llo"
irb(main):098:0> str.lstrip
=> "h  e llo       "
irb(main):099:0> str.rstrip
=> "       h  e llo"
(18)str.split 分割字串
irb(main):100:0> str = "Hello My name is Mary"
=> "Hello My name is Mary"
irb(main):101:0> str.split(" ")
=> ["Hello", "My", "name", "is", "Mary"]
#split後面沒有引數,等同於str.split(" ")
irb(main):102:0> str.split
=> ["Hello", "My", "name", "is", "Mary"]
#split後面括號裡面第2個引數,代表將str根據第一個引數分割,分割成長度為2的陣列
irb(main):103:0> str.split(" ",2)
=> ["Hello", "My name is Mary"]
irb(main):104:0> str.split(" ",3)
=> ["Hello", "My", "name is Mary"]
(19)str.upto(str1) str到str1之間的數值,包括str和str1

系統會將str.upto(str1)儲存為Enumerator(迭代器)物件,可以使用to_a將Enumerator物件轉換成陣列形式

irb(main):106:0> str_upto = "a".upto "f"
=> #<Enumerator: "a":upto("f")>
irb(main):107:0> str_upto.class
=> Enumerator
irb(main):108:0> str_upto.to_a
=> ["a", "b", "c", "d", "e", "f"]

“a”.upto(“f”)的功能和"a"…"f"是一樣的
不過前者是Enumerator(迭代器)物件,後者是Range物件,也可以使用to_a將Range物件轉換成陣列形式

irb(main):109:0> str_range = "a".."f"
=> "a".."f"
irb(main):110:0> str_range.class
=> Range
irb(main):111:0> str_range.to_a
=> ["a", "b", "c", "d", "e", "f"]
(20)str.blank? 判斷字串是否為空或者nil?

blank?、empty?、nil?的區別:
nil? 判斷物件是否為nil
empty?判斷是否為空欄位,空格不屬於空欄位
blank? 最常用,字串為""、" "、nil均被判斷為true,其他的為false,可認為是nil?和empty?的結合

irb(main):002:0> a = ""
=> ""
irb(main):003:0> a.nil?
=> false
irb(main):004:0> a.empty?
=> true
irb(main):005:0> a.blank?
=> true
irb(main):006:0> b = "  "
=> " "
irb(main):007:0> b.nil?
=> false
irb(main):008:0> b.empty?
=> false
irb(main):009:0> b.blank?
=> true

4、區間(Range)

區間分為兩種:
一種是閉合區間(包含右邊的值),就是上面講的"a"…“f”
一種是半閉半開區間(不包括右邊的值),比如"a"…“f”

irb(main):009:0> ("a".."f").to_a
=> ["a", "b", "c", "d", "e", "f"]
irb(main):010:0> ("a"..."f").to_a
=> ["a", "b", "c", "d", "e"]

區間經常會與塊結合使用,後面我們講塊的時候會講到。