Ruby語法簡要

這兩天有空學習下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支持四種打破循環的方法:

  • condition 當條件不知足時退出。
  • next 等於Java中的continue,結束如下語句直接執行下一次迭代。
  • redo 忽略如下語句,可是不進行條件判斷再次從頭執行本次迭代。
  • break 跳出循環

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

  • Module不能被繼承。
  • 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}"}

Singleton_method的幾種實現方式

  • 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"

Varialbe

Ruby支持四種不一樣表示方式的變量:

  • $ 全局變量,慎用
  • @ 實例變量,做用域爲當前實例。
  • [a-z] or _ 本地變量,做用域限於方法或者procedure。
  • [A-Z] 常量

accessor

讀取和修改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>

Exception

異常的處理,若是運行時參數或狀態不正確能夠經過raise XXX.new拋出異常,經過如下機制捕獲和處理異常。

begin
	#...
rescue
	#...
ensure
	#...

Symbol

經過:name的方式就能夠聲明一個symbol,和String徹底不一樣在一個Ruby程序的執行過程當中相同名字的symbol必然是同一個對象,不管上下文如何變化。Symbol的一個做用是提升效率,由於相比於字符串Symbol僅僅會被建立一次。

http://www.ibm.com/developerworks/cn/opensource/os-cn-rubysbl/index.html

相關文章
相關標籤/搜索