2013-05-06 72 views
1

readme.ext,其在紅寶石鏈接引導爲主要資源來開發紅寶石擴展之一,指出以下:紅寶石C擴展內部結構

通知紅寶石不允許任意指針值是一個值。它們應該是Ruby知道的結構的指針。已知結構在<ruby.h>中定義。

所以,

  1. 我怎麼能在我的對象持有任意結構,沒有暴露的呢?
  2. 是否有比ruby guides引用的資源更完整的資源?儘管我可以使用ruby C代碼來查找需要調用的函數,但很難在源代碼中找到類似上述代碼的直接答案。

謝謝!

回答

4

這涵蓋了所有的基本知識,包括如何使用C語言結構與管理的曝光爲Ruby對象,所有的宏和函數是如何工作的,和功能衆多的引用:http://media.pragprog.com/titles/ruby3/ext_ruby.pdf

你如何管理C對象與Ruby相關的部分取決於你想建立的關係。您可以簡單地在C中創建常規的Ruby對象,並且只需加快一到兩個複雜的數學運算。然後,您至少可以通過VALUE s進行工作,至少可以在所有方法的輸入上進行。您也可以通過這種方式訪問​​Ruby的所有動態和內省,因此可以通過查找那些對象感興趣的對象而無需事先知道它們被調用的內容,從而實現對實例變量的擴展。

但是,存在來自ruby.h的宏和幫助器函數,它們可以幫助鉤掛Ruby的垃圾收集器的C結構和任意C數據類型,通常通過malloc進行管理。例如,Data_Wrap_Struct函數允許您在擴展中處理它時創建一個實際上是C結構的對象,否則將作爲常規Ruby對象(用於賦值給變量等)來處理。請參閱我鏈接的文檔中的CD Jukebox示例 - 您需要使用幾個相關函數來確保您的代碼在Ruby內存管理中正確播放。

+0

謝謝,很快就會查看,然後通知您 – fotanus 2013-05-06 12:32:27

+0

將此書鏈接到此處是否合法? – fotanus 2013-05-06 12:46:01

+0

@fotanus:是的,閱讀介紹,PDF是一般免費發佈的。這是一個正式的副本。 – 2013-05-06 19:34:16