gpt4 book ai didi

ruby - 是否可以直接从 Ruby 代码调用 Rust 的结构字段,而无需将 extern "C"getter 实现到相应的字段

转载 作者:行者123 更新时间:2023-11-29 08:19:29 24 4
gpt4 key购买 nike

我正在考虑用 Rust 编写一个 Ruby gem。假设我想在 Rust 中创建一些结构,这些结构返回到类似于示例 here 的 Ruby 代码.在将 Point 结构获取到我的 Ruby 代码时,我想直接调用它的属性。目前我必须做这样的事情:

点.rb:

require "fiddle"
require "fiddle/import"

module RustPoint
extend Fiddle::Importer

dlload "./libmain.dylib"

extern "Point* make_point(int, int)"
extern "double get_distance(Point*, Point*)"
extern "int y(Point*)"
extern "int x(Point*)"

end

主要.rs:

use std::num::pow;

pub struct Point { x: int, y: int }

#[no_mangle]
pub extern "C" fn make_point(x: int, y: int) -> Box<Point> {
box Point { x: x, y: y }
}

#[no_mangle]
pub extern "C" fn x(p: &Point) -> int {
p.x
}

#[no_mangle]
pub extern "C" fn y(p: &Point) -> int {
p.y
}

并在 Ruby 中使用它:

point = RustPoint::make_point(0, 42)
# To get x:
x = RustPoint::x(point)

获取 x 值。我更喜欢这样的东西:

point = RustPoint::make_point(0, 42)
# To get x:
x = point.x

有没有人知道一个库或一种更容易实现它的方法。我认为如果我不会从 ruby 方面看到关于点对象的不同,那就更好了。无论是 C 扩展、Ruby 对象还是用 Rust 编写,我都不会有什么不同。

编辑:我希望 Rust 代码表现得像 native 扩展。因此,返回的结构应该可以从 Ruby 端调用,类似于使用 ruby​​ 对象作为值的 C 结构。当然,一个库对于处理 Rust 代码中的 ruby​​ 对象是必不可少的。

最佳答案

您可以将整个事情包装在一个自定义委托(delegate)器中:

class RustDelegator
attr_accessor :__delegate_class__, :__delegate__

def method_missing(method_name, *arguments, &block)
__delegate_class__.public_send(method_name, *__rust_arguments__(arguments), &block)
end

def respond_to_missing(name, include_private = false)
__delegate_class__.respond_to?(name, include_private)
end

private

def __rust_arguments__(arguments)
arguments.unshift(__delegate__)
end
end

class Point < RustDelegator
def initialize(x, y)
self.__delegate_class__ = RustPoint
self.__delegate__ = RustPoint::make_point(0, 42)
end
end

p = Point.new(0, 42)
#=> #<Point:0x007fb4a4b5b9d0 @__delegate__=[0, 42], @__delegate_class__=RustPoint>

p.x
#=> 0

p.y
#=> 42

关于ruby - 是否可以直接从 Ruby 代码调用 Rust 的结构字段,而无需将 extern "C"getter 实现到相应的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26418781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com