Ruby元編程小結_ruby專題

來源:互聯網
上載者:User

今天被問到此類問題,以前總是覺得這個是比較寬泛的一個概念,自己即使是用過這些特性,但卻一直不知道這叫“元編程” 直到今天被人問起的時候,方才頓悟一些,隨後便在網上和自己的平實用的一些元編程做個小總結。

原來所謂的Ruby中的元編程,是可以在運行時動態操作語言結構(如類、模組、執行個體變數等)的技術。你甚至於可以在不用重啟的情況下,在運行時直接鍵入一段新的Ruby代碼,並執行他。 

Ruby的元編程,也具有“利用代碼來編寫代碼”的作用。例如,常見的attr_accessor等方法就是如此。 
 
首先我能想到的自己用過的有這麼幾個: 

1,respond_to? 
2,define_method 
3,instance_variable_get, instance_variable_set 
4,eval 不過這個方法能盡量避免就避免,執行效率特別低!! 

具體的意思想必一看方法名字 就知道這些方法的所要實現的邏輯。 
具體可詳見http://api.rubyonrails.org/ 上具體分析源碼,很簡單。 
 
以下是我從其他地方搜尋而來,以便以後的工作中有助於提高自己的編程技能;  
 
1,內省,反射 

在Ruby中,你完全有能力在運行時查看類或對象的資訊。我們可以使用class、 instance_methods、  intance_variables等方法來達到目的。我們講這種技術成為內省(Introspection)或者反射(Reflection)。 

一說編寫元程式的語言稱之為元語言。被操縱的程式的語言稱之為目標語言。一門程式設計語言同時也是自身的元語言的能力稱之為反射或者自反。 ——摘自維基百科元編程條目。

複製代碼 代碼如下:
 
classRubyist 
  defwhat_does_he_do 
    @person='A Rubyist' 
    'Ruby programming' 
  end 
end 
   
an_object = Rubyist.new 
puts an_object.class# => Rubyist 
puts an_object.class.instance_methods(false)# => what_does_he_do 
an_object.what_does_he_do 
puts an_object.instance_variables# => @person 

 
 respond_to?方法是反射機制中另一個有用的方法。使用respond_to?方法,可以提前知道對象是否能夠處理你想要交與他執行的資訊。所有的對象都有此方法,使用respond_to?方法,你可以確定對象是否能使用指定的方法。  
 
2,instance_eval 
  Object類提供了一個名為instance_eval的公開方法,該方法可被一個執行個體調用。他提供了操作對象的執行個體變數的途徑。可以使用字串向此方法傳遞參數或者傳遞一個代碼塊。 
複製代碼 代碼如下:

classRubyist 
  definitialize 
    @geek="Matz" 
  end 
end 
obj = Rubyist.new 
 
# instance_eval可以操縱obj的私人方法以及執行個體變數 
  
obj.instance_evaldo 
  putsself# => #puts@geek# => Matz 
end 
 
 
 通過instance_eval傳遞的代碼塊使得你可以在對象內部操作。你可以在對象內部肆意操縱,不再會有任何資料是私人的!instance_eval亦可用於添加類方法。 

複製代碼 代碼如下:
 
classRubyist 
end 
   
Rubyist.instance_evaldo 
  defwho 
    "Geek" 
  end 
end 
   
puts Rubyist.who# => Geek 
 
 
const_get, const_set 

類似的,const_get和const_set用於操作常量。const_get返回指定常量的值: 
複製代碼 代碼如下:
 
puts Float.const_get(:MIN)# => 2.2250738585072e-308 

const_set為指定的常量設定指定的值,並返回該對象。如果常量不存在,那麼他會建立該常量,就是下面示範的那樣: 
複製代碼 代碼如下:
 
classRubyist 
end 
puts Rubyist.const_set("PI",22.0/7.0)# => 3.14285714285714 
 
  因為const_get返回常量的值,因此,你可以使用此方法獲得一個類的名字並為這個類添加一個新的執行個體化對象的方法。這樣使得我們有能力在運行時建立類並執行個體化其執行個體。 
複製代碼 代碼如下:
 
# Let us call our new class 'Rubyist' 
# (we could have prompted the user for a class name) 
class_name ="rubyist".capitalize 
Object.const_set(class_name,Class.new) 
# Let us create a method 'who' 
# (we could have prompted the user for a method name) 
class_name =Object.const_get(class_name) 
puts class_name# => Rubyist 
class_name.class_evaldo 
  define_method:whodo|my_arg| 
    my_arg 
  end 
end 
obj = class_name.new 
puts obj.who('Matz')# => Matz

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.