1 當(dāng)你發(fā)送消息到Ruby對(duì)象時(shí)渗勘,Ruby查詢與消息同名的方法來調(diào)用沐绒。Ruby進(jìn)行方法調(diào)用主要有兩種方式,obj.method_name 和 obj.send(:method_name)旺坠,它進(jìn)行方法調(diào)用過程如下:
查詢當(dāng)前對(duì)象的實(shí)例方法
該類引入的每個(gè)模塊(后引入的先查找)
該類的父類以及父類引入的模塊
直到Object類
通過以上路徑查找方法后乔遮,如果還找不到該方法,則調(diào)用method_missing
2 Ruby的eval功能是將一個(gè)字符串當(dāng)成代碼執(zhí)行取刃,
eval ["1","2","3"].compact.join("+")
=》6
3 defined 是用來判斷本地變量是否存在,respond_to 用來判斷對(duì)象是否能響應(yīng)指定方法蹋肮;
defined 功能還是很強(qiáng)大的,它也可以用來判斷方法是否存在
4 Ruby是一門弱類型腳本語(yǔ)言螟炫,所以常量無需指定該變量的數(shù)據(jù)類型替蔬,在使用中通常將常量的名字全部用大寫字母表示。
FINAL=100puts FINALFINAL=150puts FINAL100150
在這段代碼中定義了兩個(gè)同名的常量FINAL怨酝,在Java中崩侠,編譯器會(huì)報(bào)出錯(cuò)誤漆魔,但在ruby中不會(huì)報(bào)錯(cuò),只
會(huì)給出一個(gè)警告却音,如下:warning: already initialized constant FINAL
5 比較對(duì)象或內(nèi)容
在java常用的比較“==”改抡,“equals”。
說到比較系瓢,首先要看一下比較對(duì)象的數(shù)據(jù)類型阿纤。在ruby中數(shù)值型的有三種類型:Fixnum,Bignum夷陋,F(xiàn)loat欠拾,前兩種為整數(shù)胰锌,最后一種是浮點(diǎn)數(shù),當(dāng)整數(shù)的值小于2的30次方時(shí)清蚀,為Fixnum匕荸,大于時(shí)自動(dòng)轉(zhuǎn)換成Bignum。使用“.class”
方法可以查看當(dāng)前對(duì)象的數(shù)據(jù)類型枷邪。
num = 100puts num.class
范圍也是可以比較的榛搔。在ruby中范圍是這樣定義的
a..b:表示范圍包含a的值,b的值东揣,以及a到b之間的值践惑;
a...b:表示范圍包含a的值,以及a到b之間的值嘶卧,不包含b的值尔觉;
在ruby中范圍也是對(duì)象,是Range類的實(shí)例芥吟,Range的常用方法:
①to_a 將范圍轉(zhuǎn)換成一個(gè)數(shù)組侦铜。
②include?(a)判斷范圍中是否含有a。
③min()/first()/begin()求范圍的最小值钟鸵。
④max()/end()/last()求范圍的最大值钉稍。
Range對(duì)象還有三個(gè)常用的迭代器方法:
①reject將范圍轉(zhuǎn)換成數(shù)組,刪除滿足條件的元素
print (1..10).reject{|r| r<5}
[5, 6, 7, 8, 9, 10]
②select將范圍轉(zhuǎn)換成數(shù)組棺耍,獲取滿足條件的元素
print (1..10).select{|r| r<5}[1,2,3,4]
③each輸出范圍中的每一個(gè)元素
(1..10).each do |i| print iend12345678910
6 在其他編程語(yǔ)言中贡未,想要交換兩個(gè)變量的值,必須使用第三種變量來實(shí)現(xiàn)蒙袍;在ruby中使用并行
賦值俊卤,不用使用第三種變量。假如左邊賦值的變量多于右邊害幅,多余的變量就會(huì)置為nil消恍。同理右側(cè)多
余的也會(huì)置為nil。
a ,b="a","b"puts a,ba,b=b,aputs a,babba