1。交互方式運行ruby輸入ruby後直接寫代碼,最後按Ctrl+D表明結束;另外能夠用irb(Interactive Ruby)來執行交互編程。運行本地的ruby程序分兩步,一用irb load進xxx.rb,二而後運行這個文件中的方法。css
2。ri是一種本地命令行工具,用來瀏覽RDoc文檔。java
3。方法是經過向對象發送消息喚起調用的,消息中包含方法名和方法可能須要的參數。編程
4。ruby中獲得數字絕對值方法:-123.abs既可,但java和其它語言中則是傳給其它函數如:Math.abs(-123);這說明ruby是面象對象的。數組
5。ruby方法定義和調用是能夠不加(),但爲了可讀和優先級,最好加上()。表達示內插#{name}。ruby
6。全局變量:$xxx;類變量@@xxx;實例變量:@xxx。局部變量、方法參數、方法名必須以小寫字母或下畫線開始;類名稱、模塊名稱和常量都必須以一個大寫字母開始。方法名能夠?!=結尾。閉包
7。ruby數組和散列表都用來存儲對象,只是所用的鍵不同。函數
8。nil是一個對象,不像別的語言中的null,是隻這個對象表示什麼也沒有的對象。工具
9。使用語句修飾符至關於把if/while的條件和執行語句益交換了。學習
10。block是與方法調用放一塊兒的,入在方法調用最後,相似傳入方法的參數,能夠實現回調。使用yield語句實現回調。yield(xxx,xxx)支持傳參數,在block中使用|xxx,xxx|引用參數。例:5.times { puts "a"}ui
11。ruby中會有許多內置的變量,如$_ 。
12。ruby的構造器爲initialize。
13。ruby中已定義的類能夠隨時修改,而且修改能夠反應當已經實例化的對象中?
14。類和子類定義:class Parent [code] end class Sub < Parent [code] end。super關鍵字用來調用父類中的同名方法。而且ruby中大部分方法都有返回值,由於一個方法的最後一後默認前面加了一個return。def name @name end至關於getXXX,簡化方法爲attr_reader :name, :age這種方式創相似的建getXXX方法。而且會自動建立冒號後面的變量。def name=(n) @name = n end,既定義一個等號結尾的方法名,能使其出如今賦值操做左側。簡潔方法:attr_writer :name。虛擬方法的概念:就是實例方法名和調用時所用的方法名不一樣。
15。類變量@@開頭,而且必須實用前要實例化。類方法定義方法爲類名加點號加方法名,如Song.classMethod。
16。ruby方法訪問權限有三種:public,protected和private。方法默認是public的(initialize方法除外,默認爲private的);private的方法接收者只能是self。ruby的訪問控制是在運行期間確實而非靜態斷定。
17。變量不是對象,默認的是局部變量。對象複製person.dup,對象凍結person.freeze 。
18。數組用法有a[1,3],a[1...3] = [xxx]等,中間部分自動添nil。
19。執行block傳參數時,若是將方法中(不只僅是方法,還能夠是周圍的其它環境)的變量傳入block塊,block操做結果對其產生影響到。block最後一條表達式的值將做爲返回值返回給調用的方法。block可作事務處理,也可被用做閉包。
20。迭代方法有each,find,inject,collect。ruby中爲內部迭代器,java中爲外部迭代器,其實,迭代器本質上是迭代器模式,有內外之分。
21。method(*args) 中*args爲可變數組。定義方法時加def method(&action) action.call(self) end則方法調用時會尋找block,也就是說這個方法要和block塊配合使用。
22。字符串能夠%q,%Q分隔符來實現,還能夠用here documents實現。
23。ruby用區間實現序列、條件和間隔。..表明閉合區間,...表明左閉右開區間。區間在內存中被表示爲Range對象而不是全部的list,能夠用to_a轉爲list。<=>比較符根據大小返回-1,0,1。succ方法指向區間的下個對象,一個類實現了succ方法和<=>就能夠作爲區間。區間能夠作爲條件。區間能夠作爲間隔,判斷一些值是否落入區間內。如(1..10) === 5。
24。查詢用的方法一般以?結尾,賦值的用=結尾,危險的方法用!結尾。定義方法時*號表示可變參數;調用方法時*號表示數組展開。方法&表示關聯的block會轉化爲Proc對象做爲方法的參數。方法總會返回最後一個表達式的值。
25。ruby並行賦值a,b = 2,3。方法返回多個值不會出錯,是以數組形式返回。如:return n,m。
yum install ruby yum install ruby-irb
而後ruby -v
能夠查看Ruby版本,直接irb
就能夠進入irb了,它是Ruby的交互式解釋器。
‘=>’後面給出的是返回值。
[lzh@hostlzh /]$ irb
irb(main):001:0> a=3
=> 3 irb(main):002:0> b=2.13 => 2.13 irb(main):003:0> a**b => 10.3816951625648 irb(main):004:0> exit [lzh@hostlzh /]$
ruby的腳本文件後綴名是.rb。
[lzh@hostlzh /]$ cd /home/lzh/文檔/Ruby/ [lzh@hostlzh Ruby]$ touch 1.rb [lzh@hostlzh Ruby]$ gedit 1.rb
第一行仍是要指明解釋器在哪,看一下:
[lzh@hostlzh /]$ which ruby /usr/bin/ruby
書寫.rb腳本文件:
#!/usr/bin/ruby print("your name? ") name=gets() puts("Hello,#{name},emmm") puts("Bye,#{name},6666")
用解釋器執行:
[lzh@hostlzh Ruby]$ ruby 1.rb your name? lzh Hello,lzh ,emmm Bye,lzh ,6666 [lzh@hostlzh Ruby]$
能夠看到print是不換行的,puts是換行的。可是gets()方法會把換行符一塊兒讀進來!因此#{name}取name的值輸出出來是帶換行的。
Ruby語法極其自由,如寫成:
#!/usr/bin/ruby print "your name? " name=gets puts "Hello,#{name},emmm" puts "Bye,#{name},6666"
也同樣跑:
[lzh@hostlzh Ruby]$ ruby 1.rb your name? SB Hello,SB ,emmm Bye,SB ,6666 [lzh@hostlzh Ruby]$
(函數在不須要參數並且沒有歧義時括號能夠不要)
可是爲了減小學習Ruby和學習Python3的成本,我仍是都打上的好吧。
Python的哲學就是」作一件事只有一種方法」,而Ruby與之徹底相反,推崇用多種方法來解決問題,這也致使了Ruby工程難以多人共同協做。
Ruby是純粹的面向對象,這是吸引我學習Ruby的一個重要方面(體會一下其它語言中存在的問題),還有想試試Ruby的語法糖。
腳本的一大特性就是應當能直接接受來自命令行的輸入,命令行的輸入按順序稱爲變量ARGV[i],能夠像使用其它變量那樣使用它。
#!/usr/bin/ruby puts("第一個參數=#{ARGV[0]},第二個參數=#{ARGV[1]}")
[lzh@hostlzh Ruby]$ ruby 1.rb lzh sb 第一個參數=lzh,第二個參數=sb [lzh@hostlzh Ruby]$
標準輸入在鍵盤,標準輸出在顯示器。
gets其實是STDIN的gets()方法:
#!/usr/bin/ruby name=STDIN.gets() puts("Hello,#{name},SB")
[lzh@hostlzh Ruby]$ ruby 1.rb LZH Hello,LZH ,SB [lzh@hostlzh Ruby]$
(哇,真的很OOP)
gets()會留下換行符號的,若是不想要,再.chomp()一下:
#!/usr/bin/ruby name=STDIN.gets().chomp() puts("Hello,#{name},SB")
[lzh@hostlzh Ruby]$ ruby 1.rb LZH Hello,LZH,SB [lzh@hostlzh Ruby]$
puts其實是STDOUT的puts()方法:
#!/usr/bin/ruby name=STDIN.gets().chomp() STDOUT.puts("Hello,#{name},SB")
[lzh@hostlzh Ruby]$ ruby 1.rb LZH Hello,LZH,SB [lzh@hostlzh Ruby]$
若是不要尾接換行符,用STDOUT的print()方法:
#!/usr/bin/ruby name=STDIN.gets().chomp() STDOUT.print("Hello,#{name},SB")
[lzh@hostlzh Ruby]$ ruby 1.rb LZH Hello,LZH,SB[lzh@hostlzh Ruby]$
Ruby提供了相似C語言的格式化輸出方法,也是使用佔位符:
#!/usr/bin/ruby name=STDIN.gets().chomp() STDOUT.printf("Hello,%s,SB%d",name,1)
[lzh@hostlzh Ruby]$ ruby 1.rb lzh Hello,lzh,SB1[lzh@hostlzh Ruby]$
也即文件讀寫,在這以前,先寫點東西到文件裏:
[lzh@hostlzh Ruby]$ ll -h>tst
看一下:
[lzh@hostlzh Ruby]$ cat tst
總用量 32K
-rw-rw-r--. 1 lzh lzh 63 1月 27 13:32 1.rb -rw-rw-r--. 1 lzh lzh 64 1月 27 13:31 1.rb~ -rw-rw-r--. 1 lzh lzh 1.1K 1月 26 19:52 first.rb -rw-rw-r--. 1 lzh lzh 1.1K 1月 26 19:52 first.rb~ -rw-rw-r--. 1 lzh lzh 150 1月 27 00:23 MyFileSys -rw-rw-r--. 1 lzh lzh 15 1月 26 23:32 MyFileSys~ -rw-rw-r--. 1 lzh lzh 408 1月 27 00:50 sy4.rb -rw-rw-r--. 1 lzh lzh 405 1月 27 00:50 sy4.rb~ -rw-rw-r--. 1 lzh lzh 0 1月 27 13:36 tst [lzh@hostlzh Ruby]$
最經常使用的是File的open()方法。
#!/usr/bin/ruby file=File.open("./tst", "r") while (line=file.gets())!=nil STDOUT.print(line," 666 66 6 ") end file.close()
Ruby中不強制縮進,因此循環這樣的語句塊須要有end結束。
nil是Ruby中的一個特殊值,表示對象不存在,固然在這裏能夠把!=nil
去掉。
用於簡單I/O的方法也可用於全部有權限的文件對象,因此能夠用line=file.gets()
讀入文件中的一行,而且帶有換行符。
[lzh@hostlzh Ruby]$ ruby 1.rb 總用量 32K 666 66 6 -rw-rw-r--. 1 lzh lzh 63 1月 27 13:32 1.rb 666 66 6 -rw-rw-r--. 1 lzh lzh 64 1月 27 13:31 1.rb~ 666 66 6 -rw-rw-r--. 1 lzh lzh 1.1K 1月 26 19:52 first.rb 666 66 6 -rw-rw-r--. 1 lzh lzh 1.1K 1月 26 19:52 first.rb~ 666 66 6 -rw-rw-r--. 1 lzh lzh 150 1月 27 00:23 MyFileSys 666 66 6 -rw-rw-r--. 1 lzh lzh 15 1月 26 23:32 MyFileSys~ 666 66 6 -rw-rw-r--. 1 lzh lzh 408 1月 27 00:50 sy4.rb 666 66 6 -rw-rw-r--. 1 lzh lzh 405 1月 27 00:50 sy4.rb~ 666 66 6 -rw-rw-r--. 1 lzh lzh 0 1月 27 13:36 tst 666 66 6 [lzh@hostlzh Ruby]$
另外,也可使用File.new()方法,傳入相同的參數打開文件,但File.new()不能跟塊關聯。在這個例子裏沒有區別。
#!/usr/bin/ruby file=File.new("./tst", "r") while (line=file.gets())!=nil STDOUT.print(line," 666 66 6 ") end file.close()
輸出是同樣的。
打開文件後,也能夠用sysread()方法指定從當前文件指針向後讀多少個字符。
#!/usr/bin/ruby f=File.open("tst","r") if f!=nil str=f.sysread(40) #讀入40個字符後,文件指針在第41個字符位置 STDOUT.puts(str) else STDOUT.puts("沒能成功打開文件") end f.close()
[lzh@hostlzh Ruby]$ ruby 1.rb 總用量 32K -rw-rw-r--. 1 lzh lzh 63 [lzh@hostlzh Ruby]$
能夠用IO.readlines()方法讀入指定文件的每一行到數組中,不會自帶換行符。也不涉及打開文件和文件指針等問題。
#!/usr/bin/ruby arr=IO.readlines("tst") STDOUT.puts(arr[0]) STDOUT.puts(arr[1]) STDOUT.puts(arr[3]) STDOUT.puts(arr[1])
[lzh@hostlzh Ruby]$ ruby 1.rb
總用量 32K
-rw-rw-r--. 1 lzh lzh 63 1月 27 13:32 1.rb -rw-rw-r--. 1 lzh lzh 1.1K 1月 26 19:52 first.rb -rw-rw-r--. 1 lzh lzh 63 1月 27 13:32 1.rb [lzh@hostlzh Ruby]$
方法IO.foreach()之於方法IO.readlines(),就如方法File.open()之於方法File.new()。前者都是能夠跟塊關聯的,塊具體怎麼用後面再學。
#!/usr/bin/ruby IO.foreach("tst"){|line| puts line}
[lzh@hostlzh Ruby]$ ruby 1.rb
總用量 32K
-rw-rw-r--. 1 lzh lzh 63 1月 27 13:32 1.rb -rw-rw-r--. 1 lzh lzh 64 1月 27 13:31 1.rb~ -rw-rw-r--. 1 lzh lzh 1.1K 1月 26 19:52 first.rb -rw-rw-r--. 1 lzh lzh 1.1K 1月 26 19:52 first.rb~ -rw-rw-r--. 1 lzh lzh 150 1月 27 00:23 MyFileSys -rw-rw-r--. 1 lzh lzh 15 1月 26 23:32 MyFileSys~ -rw-rw-r--. 1 lzh lzh 408 1月 27 00:50 sy4.rb -rw-rw-r--. 1 lzh lzh 405 1月 27 00:50 sy4.rb~ -rw-rw-r--. 1 lzh lzh 0 1月 27 13:36 tst [lzh@hostlzh Ruby]$
打開的文件對象的syswrite()方法能夠向文件寫入內容,寫入的方式取決與打開時的寫方法。
r+形式的讀寫模式文件指針會放在開頭,寫的內容會隨指針移動覆蓋以前的內容:
#!/usr/bin/ruby f=File.new("tst","r+") if f!=nil f.syswrite("LZH\nSBSBSBSBSSB\nSBBBBB") else STDOUT.puts("沒法獲取文件對象") end f.close()
[lzh@hostlzh Ruby]$ ruby 1.rb
[lzh@hostlzh Ruby]$ cat tst
LZH
SBSBSBSBSSB
SBBBBB--. 1 lzh lzh 63 1月 27 13:32 1.rb
-rw-rw-r--. 1 lzh lzh 64 1月 27 13:31 1.rb~ -rw-rw-r--. 1 lzh lzh 1.1K 1月 26 19:52 first.rb -rw-rw-r--. 1 lzh lzh 1.1K 1月 26 19:52 first.rb~ -rw-rw-r--. 1 lzh lzh 150 1月 27 00:23 MyFileSys -rw-rw-r--. 1 lzh lzh 15 1月 26 23:32 MyFileSys~ -rw-rw-r--. 1 lzh lzh 408 1月 27 00:50 sy4.rb -rw-rw-r--. 1 lzh lzh 405 1月 27 00:50 sy4.rb~ -rw-rw-r--. 1 lzh lzh 0 1月 27 13:36 tst [lzh@hostlzh Ruby]$
w只寫模式,或者w+形式的讀寫模式,都會重寫已經存在的文件,或者是新建並未存在的文件。
#!/usr/bin/ruby f=File.new("tst","w+") if f!=nil f.syswrite("怎麼還不放假\n確實 強啊\t666") else STDOUT.puts("沒法獲取文件對象") end f.close()
[lzh@hostlzh Ruby]$ ruby 1.rb [lzh@hostlzh Ruby]$ cat tst 怎麼還不放假 確實 強啊 666[lzh@hostlzh Ruby]$
和C語言很像,sprintf()方法能夠格式化輸出給字符串,固然普通的不須要佔位符的也能夠用這個方法,因此只有這一個而沒有什麼」sputs()」這樣的方法。
#!/usr/bin/ruby name=STDIN.gets().chomp() str=sprintf("Hello,%s,SB%d",name,1) STDOUT.puts(str)
[lzh@hostlzh Ruby]$ ruby 1.rb 1221assad Hello,1221assad,SB1 [lzh@hostlzh Ruby]$