Модули на C для Ruby

264 views
145 views

Published on

Протасевич Владимир в данной презентации познакомит вас поближе с возможностями и способами применения модулей на С для Ruby

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
264
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Модули на C для Ruby

  1. 1. Модули на C для Ruby Протасевич Владимир Racoons Group
  2. 2. Зачем? Скорость • Порты библиотек(yaml) •
  3. 3. hello_world.c #include ruby.h ! void init_hello_world() { printf("Hello World!"); }
  4. 4. build_ext.rb require «mkmf» ! create_makefile("hello_world")
  5. 5. Done! 2.0.0-p353 :001 > require_relative ‘hello_world' => "Hello World!"
  6. 6. C++(Rice) require "mkmf" → require "mkmf-rice" rb_define_method → define_method rb_define_class → define_class
  7. 7. hello_world.cpp #include "rice/Class.hpp" void hello() { std::cout << "Hello World!"; } extern "C" void Init_hello_world() { Class test_ = define_class("Test") .define_method("hello", &hello); }
  8. 8. from_ruby() и to_ruby() • • Для многих встроенных типов уже есть Если нет: ! template<> Foo from_ruby<Foo>(Object x) {}
  9. 9. А если надо портировать класс? class Racoon { private: std::string m_name; int m_age; public: Racoon(std::string name, int age) { m_name = name; m_age = age; } void greeting() { std::cout << "Hello! My name is " << m_name << ". My age is " << m_age << std::endl; } };
  10. 10. Без проблем! extern "C" void Init_test() { Class rb_cRacoon = define_class<Racoon>("Racoon") .define_constructor(Constructor<Racoon, std::string, int>()) .define_method("greeting", &Racoon::greeting); } ! ! Ruby: 2.0.0-p353 :001 > Racoon.new('Vasya', 2).greeting Hello! My name is Vasya. My age is 2 => nil
  11. 11. Вопросы?

×