Ruby(2): 基本語法上
表示式和變數: 這兩點和其他主流的程式語言基本沒有差別,這裡直接跳過。 需要注意的是 ruby中 x=x+1 可以寫成 x+=1 但是不支援 x++ , x-- 等一元運算子 比較運算子和表示式: 在ruby中可以直接在表示式中混合使用比較運算子,來實現如果滿足某個邏輯則進行相應的表示式操作:
1 x = 10
2 puts "x is ten" if x == 10 # x is ten
除了if關鍵字還可以使用unless,這個表示和if相反的:
1 x = 24 2 puts "You are not a teenager" unless age > 12 && age < 20 # You are not a teenager
表示某個數在兩個數之間可以使用between,此時between的兩個邊界都包括:
1 x = 10
2 puts "x is in the area" if x.between?(6, 10) # x is in the area
需要注意的特殊比較符號: x<=>y,該表示式如果 x==y,則返回0;如果 x > y,則返回1; 如果x<y,則返回-1 . 迴圈: 前面看到可以使用數字的times塊來實現迴圈,可以有下面兩種形式:
1 # 使用do end來包裹邏輯程式碼塊 2 5.times do puts "test" end # testtesttesttesttest 3 4 # 使用{ }來包裹邏輯程式碼快 5 5.times {puts "test"} # testtesttesttesttest
一般來說如果迴圈的邏輯程式碼是單行且較短的時候可以使用大括號的形式,而當多行的時候建議使用do end形式。
另外對於迴圈的時候需要知道當前迴圈數的時候,可以使用下面三種形式的迭代子:
1 1.upto(10) {|number| puts number}
2 # 或者
3 do |number| puts number end
4
5 #下面同樣可以兩種方式
6 10.downto(5) {|number| puts number}
7 0.step(50, 5) {|number| puts number}
常量: 在Ruby中一般將常量命名成首字母大寫的形式,一旦變數名首字母大寫之後,雖然可以繼續改變其值,但是ruby會給出相應的警告。其實類名也是首字母大寫,某種程度上,類也可以看做是常量
字串表示式:
1 puts "abc" * 5 # abcabcabcabcabc
2 puts 'x' > 'y' # false
3 puts 'x' < 'y' # true
4 # 如果想得到一個字元ASCII碼的值,使用 ? :
5 puts ?A --> 65 # (在ruby2.3.0中好像還是會輸出字元)
6 如果想要知道某個ASCII碼對應的字元,可以使用數字 .chr方法來將其轉換為字元:
7 puts 65.chr --> A
使用字串插值:
1 puts "This is a #{'bad ' *3} word" # This is a bad bad bad word
2 # 需要注意的是這一句整個必須用雙引號括起來,而裡面的bad則可以用單引號,雙引號都可
3
4 # 另外可以再插值中使用變數:
5 x = 10
6 y = 20
7 # 如果想要輸出 10 + 20 = 30
8 # 直接輸出的話,必須呼叫數字的 .to_s 方法,否則會報錯:
9 puts x.to_s + " + " + y.to_s + " = " + (x + y).to_s
10 # 而使用插值的話,輸入為:
11 puts "#{x} + #{y} = #{x + y}"
正則表示式與字串操作: 替換: 最簡單的字串替換為:
1 "foobarbar".sub("bar", "foo") # foofoobar
該方法只替換第一次遇到的,要替換所有使用 gsub. 當然sub、gsub方法都支援正則表示式,例如要替換字串中的前兩個字元為 hello,可以使用
1 x = "foobarbar"
2 puts x.sub(/^../, "hello") # helloobarbar
用正則表示式進行迭代: 在字串中進行迭代處理,scan函式是最好的:
1 x.scan(/./) do |letter| puts letter end
其中scan的傳入引數也是一個正則表示式,該函式會遍歷字串,找到匹配的字元並進行相應的處理 。 其中常見的正則表示式特殊符號有: w(word) d(digit) s(space) ^(表開始) $(表結束) .(任意字元) A(字元開始的錨) Z(字元結束的錨) (其中w/d/s的大寫形式表示其小寫形式取反)
1 # 例如找到下面字串中的數字:
2 "the car cost $1000 and that car cost $100".scan(/d/) do |letter| puts letter end
3 # 會發現這時候是一個一個數字輸出,這時就要用到 + 號表示一個或者多個了。
4 "the car cost $1000 and that car cost $100".scan(/d+/) do |letter| puts letter end
匹配查詢: 如果只是想看下字串是否有匹配的模式,可以使用如下面的方式:
1 # the string has no digits
2 puts "the string has no digits" unless "hello, this is a test" =~ /[0-9]/
當然可以使用更強大的字串match函式,該函式不需要用 // 指定正則表示式,會預設的把中間的字串作為正則表示式,且有一個返回值,類似於java上的group。可以通過列表似的方式來訪問:
1 puts "the string has no digits" unless "hello, this is a test".match('[0-9]')
2 x = "this is a test".match(/(w+) (w+)/)
3 x[0] # this is
4 x[1] # this
5 x[2] # is
6 x[3] # nil
陣列: 初始化的時候不需要指定長度, 可以直接 a = []. Redis的陣列越界訪問元素不會報錯,只是會返回 nil。 往陣列加值: a << "word" 或者 a.push(123) --- 這兩種方法都是將元素放到陣列末尾 將值彈出來 : a.pop (這時候彈出的是最後的元素) 陣列是個先進先出的容器,但是這個pop明顯是後進先出。得到陣列長度使用的是 .length屬性。(實際上Redis中陣列或者字串的長度獲取length和size方法都可以) 可以使用join方法將陣列中的元素組合成一個長的字串,join方法可以不帶引數當做屬性用,也可以帶一個引數表示組合成新的字串之後用什麼字元進行分割。
1 irb(main):013:0> a = [1, 2,3]
2 => [1, 2, 3]
3 irb(main):014:0> a.join
4 => "123"
5 irb(main):015:0> a.join('|')
6 => "1|2|3"