小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

筆記(Ruby Hacking Guide)

 昵稱612P5 2009-05-12
1. [1, "string", 2, ["nested", "array"]]
數(shù)組元素可以使用任意對象
arr=[1,2,"str",[1,2,4]]
p arr[3]   #輸出[1,2,4]
p arr[-1]  #輸出[1,2,4]
arr.each { |item|
p item
}
#輸出1 2 "str" [1,2,4]

2. 在Ruby中,無論是變量還是常量,全都保持著引用(reference)。因此,將一個變量賦值給另一個變量時,不會發(fā)生復制。
Ruby變量的首字符表示變量的類型(作用域)。
以小寫字母或下劃線開頭的表示局部變量。
變量名以大寫字母開頭的是常量
根據(jù)Ruby的變量命名規(guī)則,第一個字母決定類型。實例變量是“@”。
變量名以@@開頭的就是類變量。
在程序的任何位置都可以對全局變量進行賦值和訪問。變量名的第一個字符為$的就是全局變量
最初的賦值兼做變量聲明,無需額外聲明。變量是無類型的,因此,無論何種類型,都可以無差別的賦值

Str="HelloWorld"
Str="Yes"  # Str是常量,Ruby將拋出警告: warning: already initialized constant Str


3.對于條件表達式,只有兩個對象——false和nil——為假,其余所有對象都是真。0和空字符串也是真
  if i <10 then
    p i
  end
  while i<10 do
    p i
  end
  
4. Ruby的類名與常量名是等價的。那么,與類名同名的常量是什么呢?實際上,就是這個類。在Ruby中,所有能操作的東西都是對象。
類自然也是對象。這種對象稱為類對象。所有的類對象都是Class類的實例。 也就是說,創(chuàng)建新類對象的class語句,
其動作是將類對象賦值給一個與類同名的常量。另一方面,生成實例的操作是,訪問這個常量,通過該對象調用方法(通常是new)

在方法執(zhí)行過程中,通常會保留自己(方法調用的實例)是誰的信息,這個信息可以通過self得到。類似于C++或Java中的this。
使用this,Ruby將拋出異常  

有時需要對一個類進行特定的初始化。這時要修改的不是new方法,而是一個名為initialize的方法。它會在new的過程中調用。

5. 只能指定一個超類??雌饋鞷uby似乎是單一繼承。但是,因為模塊的存在讓它擁有了與多重繼承同等的能力。下面就來討論一下模塊。 
一言以蔽之,模塊就是“無法指定超類,無法生成實例”的類。定義可以這樣寫。
然而它無法直接調用,因此不能創(chuàng)建實例。那么該怎么用呢?應該由其它類“include”這個模塊。這樣一來,就好像類繼承自這個模塊一樣
module M  
  def myupcase( str )  
    return str.upcase()  
  end  
end  
  
class C  
  include M  
end  
  
p(C.new().myupcase("content"))  # 顯示"CONTENT" 

M的定義必須在C的定義前面,否則將拋出異常

class Cls  
  def test()  
    return "class"   
  end  
end  
  
module Mod  
  def test()  
    return "module"   
  end  
end  
  
class C < Cls  
  include Mod  
end  
  
p(C.new().test())   # “class”? “module”? 
模塊和類哪邊更“近

6. 開頭加上::,表示“這是一個定義在頂層的常量”。就像文件系統(tǒng)的路徑一樣。假設根目錄下有個叫vmunix的文件。
在/下只寫vmunix就可以訪問它。而在全路徑下就要寫/vmunix。Const和::Const也是同樣的關系。在頂層下,可以只寫Const,
也可以按照全路徑寫::Const。   
class SomeClass  
  Const = 3  
end  
  
p(::SomeClass::Const)   # 顯示3  
p(  SomeClass::Const)   # 同樣顯示3 


class C1        # ::C1  
  ConstC1="ConstC1";
  class C2     # ::C::C2
    ConstC2="ConstC2";
    class C3   # ::C::C2::C3
      ConstC3="ConstC3";
    end
  end
end
p ::C1::C2::ConstC2  #顯示  ConstC2

7. 頂層、類定義語句內、模塊定義語句內、方法體內,都有各自完全獨立的局部變量作用域。
Ruby程序執(zhí)行過程中,到處都設置了self。就連頂層和類定義語句中都有self。 
比如,頂層甚至也有self。頂層的self稱為main。沒什么奇怪的,它就是Object的實例。 
main僅僅是為了設置self而準備的,沒有什么更深層的含義。 
因為頂層的self,也就是main,是Object的實例,所以,即便是在頂層也可以調用Object的方法。
而且Object包含了一個稱為Kernel模塊,其中定義了“函數(shù)風格的方法”,像p、puts。(圖10)。
因此,即便在頂層也可以調用p和puts。

8. Ruby對于程序庫的加載也全都是在執(zhí)行時進行的。通常這樣寫。 
Ruby代碼 
require("library_name")  
同看到的一樣,require是一個方法。根本沒有保留字。這樣寫的話,就在其所寫的地方執(zhí)行加載,執(zhí)行就轉移到那個程序庫(的代碼)。
因為Ruby中沒有Java中包的概念,如果希望劃分程序庫名稱的名字空間,就將文件分開放置到目錄里。 

9. 使用模塊作為名字空間
# net程序庫的名字空間劃分的例子  
module Net  
  class SMTP  
    # ...  
  end  
  class POP  
    # ...  
  end  
  class HTTP  
    # ...  
  end  
end  

10. singleton方法(singleton method) 
對象可以調用方法??梢哉{用的方法由對象的類決定。但是理想情況下,方法是屬于對象的。
至于類,它的存在是為了省去多次同樣方法的時間。 
實際上,Ruby有一種機制,可以為對象(實例)單獨定義方法,無論它們的類是什么。這樣寫。 
Ruby代碼 
obj = Object.new()  
def obj.my_first()  
  puts("My first singleton method")  
end  
obj.my_first()   # 顯示My first singleton method  

眾所周知,Object是所有類的超類。在這么重要的類中,不可能定義一個像my_first名稱這樣怪異的方法。 
obj是Object的實例。但是,obj卻可以調用my_first方法。
也就是說,肯定在哪定義了這個與所屬類完全沒有關系的方法。這樣為某個對象定義的方法稱為singleton方法(singleton method)。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多