[匯]Ruby知識點(一)

1.介紹Ruby的多線程正則表達式

Ruby的多線程是用戶級多線程,這樣使得Ruby的多線程移植很是容易,你並不需關心具體的操做系統;這樣作也使線程容易控制,程序不容易產生死鎖這類嚴重的線程問題。
可是同時,因爲Ruby的多線程並非真正意義上的操做系統級多線程,無論代碼使用了多少個Thread類的實例,都只會在啓動解釋器這一個進程內執行,由Ruby解釋器進行具體的線程切換管理,其效率要低於由操做系統管理線程的效率,且不能使用多個CPU。
在Ruby中同時作多件事最簡單的方式就是使用Thread類,Thread類提供了一種高效和輕量級的手段來同時處理多件任務。
Thread類由Ruby解釋器具體實現,提供了一種同時處理多個任務的方法, Thread類實現的並非操做系統級多線程。
Ruby多線程的優勢和缺點一樣明顯,缺點是效率不如操做系統級多線程,不能使用多個CPU,但其優勢也很明顯,便可移植性很高。這就須要設計人員綜合考慮。ruby

當Ruby程序執行完畢的時候,他會殺掉全部的線程,無論其它的線程的運行狀態如何。若是沒有使用join方法,那麼主程序執行完畢後會把全部沒有執行完畢的線程殺掉。
上面的實例程序中,當主程序運行完畢時,兩個線程都沒有運行結束就被停止掉了。咱們可使用join方法來讓主程序等待某個特定線程結束,對每個線程使用join方法,能夠確保在程序結束前全部的線程能夠運行完畢。

x = Thread.new { sleep 0.1; print 「x」; print 「y」; print 「z」 }
a = Thread.new { print 「a」; print 「b」; sleep 0.2; print 「c」 }
x.join
a.join多線程

 

2.ruby如何進行集成操做?ruby能進行多重集成嗎?ide

Ruby繼承的語法很簡單,使用 < 便可。
Ruby語言只支持單繼承,每個類都只能有一個直接父類。這樣避免了多繼承的複雜度。但同時,Ruby提供了mixin的機制能夠用來實現多繼承。
可使用super關鍵字調用對象父類的方法,當super省略參數時,將使用當前方法的參數來進行調用。函數

3.ruby的特色spa

概括起來,Ruby有如下優勢:
解釋型執行,方便快捷
Ruby是解釋型語言,其程序無需編譯便可執行。
語法簡單、優雅
語法比較簡單,相似Algol系語法。
徹底面向對象
Ruby從一開始就被設計成純粹的面嚮對象語言,所以全部東西都是對象,例如整數等基本數據類型。
內置正則式引擎,適合文本處理
Ruby支持功能強大的字符串操做和正則表達式檢索功能,能夠方便的對字符串進行處理。
自動垃圾收集
具備垃圾回收(Garbage Collect,GC)功能,能自動回收再也不使用的對象。不須要用戶對內存進行管理。
跨平臺和高度可移植性
Ruby支持多種平臺,在Windows, Unix, Linux, MacOS上均可以運行。Ruby程序的可移植性很是好,絕大多數程序能夠不加修改的在各類平臺上加以運行。
有優雅、完善的異常處理機制
Ruby提供了一整套異常處理機制,能夠方便優雅地處理代碼處理出錯的狀況。
擁有不少高級特性
Ruby擁有不少高級特性,例如操做符重載、Mix-ins、特殊方法等等,是用這些特性能夠方便地完成各類強大的功能。

同時,因爲是解釋型語言,Ruby也有下列缺點:
解釋型語言,因此速度較慢
靜態檢查比較少操作系統

 

4.解釋下ruby的特殊方法和特殊類線程

特殊方法是指某實例所特有的方法。一個對象有哪些行爲由對向所屬的類決定,可是有時候,一些特殊的對象有何其餘對象不同的行爲,在多數程序設計語言中,例如C++和Java,咱們必須定義一個新類,但在Ruby中,咱們能夠定義只從屬於某個特定對象的方法,這種方法咱們成爲特殊方法(Singleton Method)。

class SingletonTest
  def info
   puts 「This is This is SingletonTest method」
  end
end

obj1 = SingletonTest.new
obj2 = SingletonTest.new

def obj2.info
  puts 「This is obj2″
end

obj1.info
obj2.info

 執行結果爲:
This is This is SingletonTest method
This is obj2

有時候,咱們須要給一個對象定義一系列的特殊方法,若是按照前面的方法,那麼只能一個一個定義:

def obj2.singleton_method1
end

def obj2.singleton_method2
end

def obj2.singleton_method3
end
……
def obj2.singleton_methodn
end

這樣作很是繁複麻煩,並且沒法給出一個統一的概念模型,所以Ruby提供了另一種方法,
class << obj
……
end

obj是一個具體的對象實例,class << 表明它的特殊類。

class SingletonTest
  def meth1
   puts 「This is meth1″
  end

  def meth2
   puts 「This is meth2″
  end
end

obj1 = SingletonTest.new
obj2 = SingletonTest.new

class << obj2
  def meth1
   puts 「This is obj2′s meth1″
  end
 
  def meth2
   puts 「This is obj2′s meth2″
  end
end

obj1.meth1
obj1.meth2
obj2.meth1
obj2.meth2

執行結果爲:
This is meth1
This is meth2
This is obj2′s meth1
This is obj2′s meth2設計

 

5.ruby如何實現動態方法調用指針

在Ruby中,有多種方法能夠實現方法的動態調用。1. 使用send方法第一種實現動態方法調用是使用send方法,send方法在Object類中定義,方法的第一個參數是一個符號用來表示所要調用的方法,後面則是所調用方法須要的參數。「This is a dog1″.send(:length) => 14上面的代碼中經過send方法去對一個字符串執行length操做,返回字符串的長度。class TestClass def hello(*args)  」Hello 」 + args.join(‘ ‘) endenda = TestClass.newputs a.send :hello, 「This」, 「is」, 「a」, 「dog!」執行結果爲:Hello This is a dog!2. 使用Method類和UnboundMethod類另外一種實現動態方法調用是使用Object類的method方法,這個方法返回一個Method類的對象。咱們可使用call方法來執行方法調用。test1 = 「This is a dog1″.method(:length)test1.call  => 14class Test def initialize(var)  @var = var end  def hello()  」Hello, @var = #{@var}」 endendk = Test.new(10)m = k.method(:hello)m.call   #=> 「Hello, @iv = 99″l = Test.new(‘Grant’)m = l.method(「hello」)m.call   #=> 「Hello, @iv = Fred」能夠在使用對象的任何地方使用method對象,當調用call方法時,參數所指明的方法會被執行,這種行爲有些像C語言中的函數指針。你也能夠把method對象做爲一個迭代器使用。def square(a) a*aendmObj = method(:square)[1, 2, 3, 4].collect(&mObj)  => [1 4 9 16]Method對象都是和某一特定對象綁定的,也就是說你須要經過某一對象使用Method對象。你也能夠經過UnboundMethod類建立對象,而後再把它綁定到某個具體的對象中。若是UnboundMethod對象調用時還沒有綁定,則會引起異常。class Double def get_value  2 * @side end   def initialize(side)   @side = side  endenda = Double.instance_method(:get_value) #返回一個UnboundMethod對象s = Double.new(50)b = a.bind(s)puts b.call執行結果爲:100看下面一個更具體的例子:class CommandInterpreterdef do_2() print 「This is 2」; end def do_1() print 「This is 1」; end def do_4() print 「This is 4」; end def do_3() print 「This is 3」; end   Dispatcher = {   ?2 => instance_method(:do_2),   ?1 => instance_method(:do_1),   ?4 => instance_method(:do_4),   ?3 => instance_method(:do_3) } def interpret(string)   string.each_byte {|i| Dispatcher[i].bind(self).call }  endendinterpreter = CommandInterpreter.newinterpreter.interpret(’1234′)執行結果爲:This is 1This is 2This is 3This is 43. 使用eval方法咱們還可使用eval方法實現方法動態調用。eval方法在Kernel模塊中定義,有多種變體如class_eval,module_eval,instance_eval等。Eval方法將分析其後的字符串參數並把這個字符串參數做爲Ruby代碼執行。str = 「Hello」eval 「str + ‘ World!’」 => Hello World!sentence = %q{「This is a test!」.length}eval sentence => 15當咱們在使用eval方法時,咱們能夠經過eval方法的第二個參數指明eval所運行代碼的上下文環境,這個參數能夠是Binding類對象或Proc類對象。Binding類封裝了代碼在某一環境運行的上下文,能夠供之後使用。class BindingTest def initialize(n)   @value = n end def getBinding   return binding() #使用Kernel#binding方法返回一個Binding對象  endendobj1 = BindingTest.new(10)binding1 = obj1.getBindingobj2 = BindingTest.new(「Binding Test」)binding2 = obj2.getBindingputs eval(「@value」, binding1)  #=> 10puts eval(「@value」, binding2)  #=> Binding Testputs eval(「@value」)     #=> nil能夠看到上述代碼中,@value在binding1所指明的上下文環境中值爲10,在binding2所指明的上下文環境中值爲Binding Test。當eval方法不提供binding參數時,在當前上下文環境中@value並未定義,值爲nil。

相關文章
相關標籤/搜索