這兩天有空學習下Ruby,如下簡單記錄Ruby的一些關鍵信息。html
==、equal?java
== 比較兩個變量的值是否相等;equal?比較的是內存地址。和Java恰好相反。設計模式
ifruby
if...end if...elsif...end if...else...end
條件判斷if能夠有兩種寫法,多條語句時:函數
if condition #do something end
單條語句時:學習
#do something if condition
case設計
case when condition1 ... when ...end
case功能相似於c或者java中的switch,可是更強大code
i=5 case i when 1 puts "1" when 2...6 puts "2~5" end
以上代碼會輸出2~5。在case中使用操做符「===」比較分支,因爲Ruby是徹底面向對象的程序語言,因此根據分支數據的不一樣類型===表現出不一樣的行爲。htm
while對象
while...redo...next...break...end
while支持四種打破循環的方法:
C語言描述:
while (condition) { label_redo: goto label_next; /* ruby's "next" */ goto label_break; /* ruby's "break" */ goto label_redo; /* ruby's "redo" */ ... ... label_next: } label_break: ...
for
for...in...
for num in collection puts num end
each
除了使用循環,還能夠直接用each對colleciton、array進行迭代
arr=[1,2,3] arr.each{|num| puts num}
或者是:
arr=[1,2,3] arr.each do |num| num*=2 puts num end
說法可能不妥,只是我的理解。從大到小Ruby可分爲Module、Class、method、procedure(block)。
Module
Ruby官方指明Module有兩個用處:一個Module能夠用於封裝一系列功能相關的函數,好比Math;另外一個則是經過mixin技術實現Ruby class行爲的多重繼承:
module TALK def talk puts "talk ... talk .." end end class Person include TALK end person=Person.new person.talk
除此之外,我的以爲Module 相似於Java中的Package,實現了Class命名空間的隔離。
Class
和其餘面嚮對象語言中Class的含義同樣,是一類對象共同特徵的抽象。Class只能單一繼承。
在Ruby中class也是一個對象,其父類是Module,全部對象的根父類都是Object。
super關鍵字可用於繼承關係中調用父方法:
Class Person def talk #... end end Class SubPerson < Person def talk super #... end end
class_eval關鍵字能夠實現動態的修改、增長class的行爲,代碼忽略。
Method
method能夠在class內外聲明,在class外直接聲明的method更像腳本語言中的function,而在class中聲明的方法則等同於Java語言中的method,能夠被class的實例使用。
在method中經過關鍵字self能夠得到方法接受者(receiver)。
除此之外,還有一類特殊的單例方法singleton_method,這裏並不是設計模式的單例方法。而是指分配給某個可是實例的方法,如下代碼中talk_loudly是personA的singleton_method,由於它只屬於personA,其餘Person實例是沒法得到此特性的。
class Person def talk #... end end personA=Person.new def personA.talk_loudly #... end
Procedure
Ruby中強大的地方還在於能夠直接傳遞代碼塊(block),在本質上procedure等於block,只是block是匿名的只能被傳遞一次,重複使用須要屢次書寫相同代碼;因爲Ruby面向對象的特徵block也是一個對象,將其賦值給一個變量就成爲了procedure能夠被重複使用。
block的聲明方式能夠用do...end(多行)和{}(單行)兩種。
yield關鍵字,要實現each方法的功能,ruby實際上使用了yield關鍵字,若是一個方法在調用時被隱含傳遞了block(method(arg) {}),則在方法內調用yield會執行其內容:
def method(name) if block_given? puts yield name else puts "Hello, #{name}" end end #output Hello, gangzz method("gangzz") #output Hey, gangzz method("gangzz") {|n| puts "Hey, #{n}"}
def關鍵字
class Person def talk #... end end personA=Person.new def personA.talk_loudly #... end
class<<Instance的方式
class Person def talk #... end end personA=Person.new class<< personA def talk_loudly #... end end
instance_eval
class Person def talk #... end end personA=Person.new personA.instance_eval "def talk_loudly;#...;end"
Ruby支持四種不一樣表示方式的變量:
讀取和修改Class屬性的語法糖?
<table border="1"> <tbody> <tr><td><em> Shortcut </em> </td><td> <em> Effect </em> </td></tr> <tr><td> <code> attr_reader :v </code> </td><td> <code> def v; @v; end </code> </td></tr> <tr><td> <code> attr_writer :v </code> </td><td> <code> def v=(value); @v=value; end </code> </td></tr> <tr><td> <code> attr_accessor :v </code> </td><td> <code> attr_reader :v; attr_writer :v </code> </td></tr> <tr><td> <code> attr_accessor :v, :w </code> </td><td> <code> attr_accessor :v; attr_accessor :w </code></td></tr></tbody></table>
異常的處理,若是運行時參數或狀態不正確能夠經過raise XXX.new拋出異常,經過如下機制捕獲和處理異常。
begin #... rescue #... ensure #...
經過:name的方式就能夠聲明一個symbol,和String徹底不一樣在一個Ruby程序的執行過程當中相同名字的symbol必然是同一個對象,不管上下文如何變化。Symbol的一個做用是提升效率,由於相比於字符串Symbol僅僅會被建立一次。
http://www.ibm.com/developerworks/cn/opensource/os-cn-rubysbl/index.html