首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用ruby内置类时调用ruby扩展方法

如何在使用ruby内置类时调用ruby扩展方法
EN

Stack Overflow用户
提问于 2014-08-26 01:16:53
回答 1查看 140关注 0票数 0

为了跟踪a question I asked alreadykind of solved as far as I got the answer to my question,尽管从解决的问题中产生了一个新问题,即:

使用Complex API的问题是它不能识别来自NMatrix接口的shape方法:

因此,当我在my compiled C extension上运行以下规范代码时

代码语言:javascript
复制
  it "Creates a new FFTW.r2c object and takes an a 1D NMatrix as its argument" do
    n = NMatrix.new([4], [3.10, 1.73, 1.04, 2.83])

    r = FFTW.Z(n)
    i = FFTW.Z(FFTW.r2c_one(r))
    #expect(fftw).to eq(fftw)
  end

存在错误,因为shape属于nmatrix类。

代码语言:javascript
复制
 FFTW Creates a new FFTW.r2c object and takes an a 1D NMatrix as its argument
     Failure/Error: i = FFTW.Z(FFTW.r2c_one(r))
     NoMethodError:
       undefined method `shape' for NMatrix:Class
     # ./spec/fftw_spec.rb:26:in `r2c_one'
     # ./spec/fftw_spec.rb:26:in `block (2 levels) in <top (required)>'

Shape是从nmatrix类调用的,所以我可以理解为什么会发生这种情况,但不知道如何绕过它。

的结果

代码语言:javascript
复制
  it "Creates a new FFTW.r2c object and takes an a 1D NMatrix as its argument" do
    n = NMatrix.new([4], [3.10, 1.73, 1.04, 2.83])

    fftw = FFTW.Z(n)
    expect(fftw).to eq(fftw)
  end

代码语言:javascript
复制
/home/magpie/.rvm/rubies/ruby-2.1.2/bin/ruby -I/home/magpie/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.4/lib:/home/magpie/.rvm/gems/ruby-2.1.2/gems/rspec-support-3.0.4/lib -S /home/magpie/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.4/exe/rspec ./spec/fftw_spec.rb
./lib/fftw/fftw.so found!

FFTW
  creates an NMatrix object
  Fills dense with individual assignments
  Creates a new FFTW.r2c object and takes an a 1D NMatrix as its argument

Finished in 0.00091 seconds (files took 0.07199 seconds to load)
3 examples, 0 failures
EN

回答 1

Stack Overflow用户

发布于 2014-08-26 03:01:22

我认为问题出在fftw.cpp中的这段代码

第51-56行:

代码语言:javascript
复制
static VALUE
fftw_shape(VALUE self)
{
  // shape is a ruby array, e.g. [2, 2] for a 2x2 matrix
  return rb_funcall(cNMatrix, rb_intern("shape"), 0);
}

您正尝试在这里的NMatrix类上调用shape。rb_funcall的工作原理是这样的:

代码语言:javascript
复制
rb_funcall(object_to_invoke_method, method_to_invoke, number_of_args, ...)

问题是在第一个参数位置有cNMatrix,所以它试图将shape方法发送给NMatrix类,而不是对象。所以你真的想在nmatrix对象上调用它,就像这样:

代码语言:javascript
复制
static VALUE
fftw_shape(VALUE self, VALUE nmatrix)
{
  // shape is a ruby array, e.g. [2, 2] for a 2x2 matrix
  return rb_funcall(nmatrix, rb_intern("shape"), 0);
}

在第82行:

代码语言:javascript
复制
VALUE shape = fftw_shape(self, nmatrix);

这有帮助吗?我认为唯一的问题是您在类上调用了shape,但可能会突然出现其他问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25491034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档