你能在Ruby中实现`Data`类的数据吗?

时间:2018-01-27 14:46:33

标签: ruby reflection metaprogramming ruby-c-extension

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

RubyCClass.new.someMethod()

Ruby引发了以下错误:

Error: wrong argument type RubyCClass (expected Data)

有没有办法可以正确地实例化这个类,以便RubyCClass被实例化到someMethod将开始执行的程度?换句话说,我是否可以将Data注入RubyCClass,以便someMethod开始执行?

2 个答案:

答案 0 :(得分:0)

[注:当问题完全不同时,会回答这个问题;从那时起它就被编辑了。]

我不完全确定您的问题,但我认为您的主要问题是因为您使用的是method而不是public_send。 (顺便说一下,如果有帮助的话,你可以通过调用object.public_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

答案 1 :(得分:0)

我不确定该错误的生成位置;当引擎正在评估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