Вызов методов класса Ruby от C++

Попробуйте это

$users = User::join('users', 'users.id', '=', 'user_detail')->get();

Следует объединить две таблицы со всеми необходимыми записями.

5
задан Robert Rouse 30 January 2009 в 17:01
поделиться

2 ответа

Прежде всего, go поскольку Вы определили его, не метод класса, а метод экземпляра.

Как объектно-ориентированный язык, все рубиновые методы требуют получателя, то есть, объект, на который вызывается метод. Например, методы, получатель является экземпляром класса для методов класса, получатель является самим объектом класса.

? заполнитель, которого Вы имеете, является слотом для получателя вызова метода.

Если Вы хотите оставить его как метод экземпляра, то необходимо сделать это:

rb_funcall(a_CallTest_instance, rb_intern("go"), 0);

где a_CallTest_instance был экземпляр CallTest, Вы создали использование rb_class_new_instance().

Если Вы превращаете его в метод класса:

class CallTest
  def self.go
    # ...
  end
end

Затем необходимо использовать CallTest сам класс как получатель:

rb_funcall(klass, rb_intern("go"), 0);

Можно получить ссылку на CallTest использование класса rb_const_get()

VALUE klass = rb_const_get(rb_cObject, rb_intern('CallTest'));

Использовать rb_cObject там, с тех пор CallTest определяется в глобальном контексте.

Я предложил бы читать главу в Кирке о расширении рубина.

7
ответ дан 13 December 2019 в 22:18
поделиться

Я также использую SWIG. Эти конкретные файлы примеров должны вам помочь.

1) test.rb

require 'test.so'
class A
    def func1(buffer)
        puts "ruby instance method: #{buffer}"
    end
end
def func2(buffer)
    puts "ruby global method: #{buffer}"
end
module Z
    def Z.func3(buffer)
        puts "ruby module method: #{buffer}"
    end
end

a = A.new
t = Test::Test1.new()
t.call(a, "func1", "Hello", 5)
t.call(method(:func2), "func2", "Yabaaa", 6)
t.call(Z, "func3", "Yahooooooo", 10)

2) test.h:

#include <ruby.h>
class Test1
{
public:
    void call(VALUE obj, char* func_name, const char* buffer, int size)
    {
        VALUE val = rb_str_new(buffer, size);   
        rb_funcall(obj, rb_intern(func_name), 1, val);
    }
};

3) test.i:

%module test

%{
#include "test.h"
%}

%exception
{
    try
    {
        $action
    }
    catch (std::exception& ex)
    {
        static VALUE cpperror = rb_define_class("test Exception", rb_eStandardError);
        rb_raise(cpperror, ex.what());
    }
    catch (...)
    {
        static VALUE cpperror = rb_define_class("test UnknownException", rb_eStandardError);
        rb_raise(cpperror, "Unknown catched");
    }
}

%include "test.h"

ВЫХОД:

ruby ./test.rb 
ruby instance method: Hello
ruby global method: Yabaaa
ruby module method: Yahooooooo
3
ответ дан 13 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: