您能否实例化'Data'类';Ruby中的数据是什么?

您能否实例化'Data'类';Ruby中的数据是什么?,ruby,reflection,metaprogramming,ruby-c-extension,Ruby,Reflection,Metaprogramming,Ruby C Extension,尝试使用Ruby-C-Class的实例方法时: RubyCClass.new.someMethod() Ruby正在引发以下错误: Error: wrong argument type RubyCClass (expected Data) 是否有任何方法可以正确实例化该类,从而将rubyclass实例化到somethod将开始执行的程度?换句话说,是否有一种方法可以将数据注入rubyclass,从而someMethod开始执行?[注意:这个答案是在问题完全不同时发布的;从那时起就被编辑过。]

尝试使用Ruby-C-Class的实例方法时:

RubyCClass.new.someMethod()
Ruby正在引发以下错误:

Error: wrong argument type RubyCClass (expected Data)

是否有任何方法可以正确实例化该类,从而将
rubyclass
实例化到
somethod
将开始执行的程度?换句话说,是否有一种方法可以将
数据
注入
rubyclass
,从而
someMethod
开始执行?

[注意:这个答案是在问题完全不同时发布的;从那时起就被编辑过。]

我不完全确定您的问题是否正确,但我认为您的主要问题在于您使用的是
方法
,而不是
公共发送
。(顺便说一下,如果有帮助的话,您可以通过调用
object.public\u methods
,获得对象的公共方法列表。)

下面是一些代码,它们说明了什么可能适合您:

#!/usr/bin/env ruby

class MethodAccessibility

  attr_reader :accessibles, :inaccessibles

  def initialize
    @accessibles = []
    @inaccessibles = []
    populate_data
  end


  def method_accessible?(object, method_name, *args)
    begin
      object.public_send(method_name, args)
      true
    rescue Exception => e
      e.to_s != "Error: This method cannot be used within the User Interface"
    end
  end

  def add_to_appropriate_array(object, method_name, *args)
    accessible = method_accessible?(object, method_name, args)
    (accessible ? accessibles : inaccessibles) << method_name
  end


  def populate_data
    object = # create the object on which to call the methods
    add_to_appropriate_array(object, :method1, [:arg1, :arg2]) # for examples
    add_to_appropriate_array(object, :method2, [])
    # ...
  end
end

ma = MethodAccessibility.new
ma.accessibles # do something with this array, or the `inaccessibles` array
#/usr/bin/env ruby
类方法可访问性
属性读取器:可访问,不可访问
def初始化
@可访问性=[]
@不可访问=[]
填充数据
结束
可访问的定义方法?(对象、方法名称,*args)
开始
object.public\u send(方法名称,args)
真的
救援异常=>e
e、 到美国!=“错误:此方法不能在用户界面中使用”
结束
结束
def将_添加到_适当的_数组(对象、方法名称、*args)
可访问=方法\可访问?(对象、方法\名称、参数)

(可访问?可访问:不可访问)我不确定该错误是在哪里产生的;是在引擎计算Ruby代码返回的值时发生的吗

如果是这样,您可以做任何您想做的事情,然后返回一个虚拟数据对象:

RubyCClass.new.someMethod()
# do other things, then:
Data.new 
# or whatever it is you do to create a Data instance;
# as the final value in your code it will be returned

你能简化这个问题吗?这里有太多的信息,我不确定问题是什么。我试图简化这个问题,让我知道它是否更好!您在什么上下文中运行此代码?提供的信息量不足以回答问题。不确定“在什么上下文中”是什么意思,但它是另一个应用程序中的Ruby引擎,该应用程序通过Ruby C扩展公开了某些类。这些类通常通过API的其他方法在内部实例化。然而,在这个例子中,如果可能的话,我宁愿自己实例化对象,因为我想要一刀切的代码,而不是唯一的代码,通过它们预期的方式分别实例化每个类。这将很困难。您正在与Ruby引擎的设计作斗争,该引擎显然只用于创建
数据
实例。没有办法与编写它的开发人员通信吗?在这个例子中,我无法首先实例化对象,因此
public\u send
毫无帮助。例如,
rubyclass.public\u send(:method)
返回-
错误:未定义的方法“length”
(因为length是一个实例方法),以及
rubyclass.new.public\u send(:method)
返回-
错误:教程中的参数类型rubyclass(预期数据)
,在
allocate
函数中:
returndata\u Wrap\u Struct(klass,NULL,deallocate,string)
这告诉我们,
数据
是Ruby
包装的数据的无效指针。因此,来自C扩展的类只是一个类型为
Data
的包装指针。。。我想这是行不通的,除非我能得到
数据的指针并读取它背后的数据结构。。。只有这样,我才有可能重新创建它。所以我想我需要使用
Fiddle::Pointer[rubyclass]
或其他东西来获取指向类存储位置的指针,从这里导航到指向数据结构的指针并在这里插入数据。。。说实话,xD看起来并不太简单,如果我自己放弃这个项目,它可能更值得一试:P