我想知道如何將以C擴展名編寫的本機方法添加到預先存在的Ruby類中?我只發現允許你創建新的Ruby類的函數,但沒有一個返回一個預先存在的類。將C本地方法添加到預先存在的Ruby類中
回答
是的,你可以。在任何一種情況下,您都使用rb_define_method
(或對單例方法使用rb_define_singleton_method
)。假設你有交流功能稱爲rb_some_function
是預計1個參數(除自參數),你會做
rb_define_method(someClass,
"some_function",
RUBY_METHOD_FUNC(rb_some_function),
1);
這是給你SomeClass的是否是一個新創建的類(rb_define_class_under
或rb_define_class
創建)或現有課程。您可以使用rb_const_get
(與Object的const_get
相同)獲取現有類。
someClass = rb_const_get(rb_cObject, rb_intern("SomeClass"));
rb_define_class
也將獲取對您現有的類(類似於紅寶石重新打開類)。如果你嘗試用超類定義一個類並且該類已經存在一個不同的類,它將以類似的方式炸燬。
正如Neil所說,rb_define_class是否重新打開現有類,還是使用rb_const_get更好? – yageek
'rb_const_get(rb_cObject,rb_intern(「Foo」));'類似於將類命名符號'Foo'放入您的代碼中。例如。如果你願意,可以直接在Ruby中寫下「def Foo.bar」(無論出於何種原因)。而'rb_define_class(「Foo」,rb_cObject)'與Ruby'class Foo'中的寫法相同。我會相應地使用它們,這意味着我通常會避免使用'rb_const_get'方法,除非我正在編寫類元編程的擴展 –
如果我期望類存在,我傾向於使用rb_const_get - 如果類不在那裏,那麼我想讓我的代碼炸燬,而不是僅僅創建一個新的類。取決於我感覺到多麼偏執,儘管 –
- 1. 將一些innerHTML預先添加到本地JavaScript中的div中
- 2. 將方法添加到Ruby數組類
- 3. 如何動態地將方法添加到C++中的類中?
- 4. 使用iTextSharp/iText將表添加到預先存在的PDF中
- 5. 將類方法添加到ruby中的現有模塊中
- 6. 動態添加到Ruby類的方法
- 7. 如何將小部件添加到預先存在的QLayout?
- 8. 更好地將方法添加到預定義的類或創建子類?
- 9. 如何將GUI添加到預先存在的C++控制檯應用程序?
- 10. 預先添加到文本文件
- 11. 將本地用戶添加到C#中的本地組中
- 12. 將數字預先添加到數字
- 13. 預先添加到Iterable?
- 14. 如何動態地將方法添加到Objective-C中的類中?
- 15. 添加顯示一個時間功能並將幻燈片動畫添加到預先存在的腳本中
- 16. 在Ruby中動態添加(預定義的)實例方法
- 17. C++將方法添加到頭文件中定義的類
- 18. 將異步方法添加到C#中的類?
- 19. 在預先添加文本的應用郵件目標-c
- 20. 無法預先添加AJAX內容在
- 21. Rails的添加方法Ruby類問題
- 22. 使用HtmlHelper.BeginForm擴展方法預先添加到URL路徑
- 23. 將方法添加到導入的類
- 24. 如何將資產版本預先添加到css和js?
- 25. PHP添加特定鍵值到預先存在的陣列
- 26. 使用預先存在的字典添加到int值
- 27. 添加自定義web.config屬性到預先存在的元素
- 28. 添加支持IE8到預先存在的Protovis項目
- 29. 添加角度動畫到預先存在的堆棧
- 30. 添加方法硒的webdriver在Ruby中
簡單的方法imho將用c-extension定義ruby類,然後用純ruby重新打開它。對?在Ruby中,你不能重新定義一個類,你只需重新打開它並添加到它。 – nathanvda
我沒有遇到任何問題。 AFAIK,相關的C函數 - 例如'rb_define_class'將很高興地「重新打開」類和模塊,因爲它們實際上與MRI Ruby中使用的功能相同。 –