Tag: ruby

Ruby的max函数命令如何重复?

我一直在看Ruby的Enumerable mixin(v2.4.1)中的max方法 。 这是一种相当简单的方法,但是当重复项存在时它如何命令项目有点令人困惑。 例如: x = [1,2,3,4,5,6,7,8,9] x.max {|a, b| a%2 b%2} => 1 10.times{|y| p x.max(y) {|a, b| a%2 b%2}} [] [1] [1, 7] # why is 7 the next element after 1? [3, 1, 5] # why no more 7? [7, 3, 1, 5] # 7 is now first [9, 7, 3, […]

Ruby解释器嵌入在C代码中

我只是从一本书中尝试一个简单的例子:我有一个sum.rb文件: class Summer def sum(max) raise “Invalid maximum #{max}” if max < 0 (max*max + max)/2 end end 还有一个embed_sum.c文件: #include #include int main ( int argc, char ** argv) { VALUE result; ruby_sysinit(&argc, &argv); RUBY_INIT_STACK; ruby_init(); ruby_init_loadpath(); rb_require(“sum”); rb_eval_string(“$summer = Summer.new”); rb_eval_string(“$result = $summer.sum(10)”); result = rb_gv_get(“result”); printf(“Result = %d\n”, NUM2INT(result)); return ruby_cleanup(0); } 我编译它: […]

我可以覆盖用C编写的Ruby方法吗?

是否有可能用Ruby代码rb_error_frozen属于Ruby本身的方法,例如用C语言编写的rb_error_frozen ? 背景 :我想知道在修改冻结对象时是否可以使Ruby仅记录警告,而不是引发exception。 这样,我可以记录各种状态修改,而不是在第一个修改时停止。 我主要是想用YARV来做这件事,但如果能让它变得更容易,我可以使用另一个实现。 是的,这是一个崭新的项目! 不要在生产环境中尝试这个!

有没有办法让类变量与setter / getter一样的虚拟变量?

我将Ruby嵌入到我的C项目中,并希望加载几个定义从我自己的父类inheritance的类的文件。 每个inheritance的类都需要在初始化时设置一些变量,我不希望Ruby和C有两个不同的变量。 有没有办法定义一个具有自己的自定义setter / getter的类变量,或者这是一种处理它的愚蠢方法? 使用自定义数据类型可能会更好吗?

将ruby数组值传递到C数组中

我正在尝试基于此配方为C中的ruby创建一个独立的FFT扩展 我已经注意到几种在ruby和c之间传递不同值的方法。 然而,对于ruby和C来说,它都是相当新的,并且无法解决如何将数组从VALUE ruby​​对象复制到C数组中的问题。 编译错误:SimpleFFT.c:47:错误:下标值既不是数组也不是指针 和代码: #include “ruby.h” #include “fft.c” // the c file I wish to wrap in ruby VALUE SimpleFFT = Qnil; void Init_simplefft(); VALUE method_rfft(VALUE self, VALUE anObject); void Init_simplefft() { SimpleFFT = rb_define_module(“SimpleFFT”); rb_define_method(SimpleFFT, “rfft”, method_rfft, 1); } VALUE method_rfft(VALUE self, VALUE inputArr) { int N = RARRAY_LEN(inputArr); // this works […]

Ruby代码中的C / C ++?

C / C ++是编写Ruby应用程序的一些性能关键方面的好选择。 我知道这是可能的。 我想知道如何将C / C ++代码添加到Ruby代码中; 任何其他语言。 您是否在开源项目中注意到了这方面的实际应用?

在ruby进程之间使用大型数据对象

如果使用Marshal.dump写入文件,我有一个大约10兆字节的Ruby哈希。 在gzip压缩之后它大约是500千字节。 迭代和更改此哈希在ruby中非常快(毫秒的分数)。 即使复制它也非常快。 问题是我需要在Ruby on Rails进程之间共享此哈希中的数据。 为了使用Rails缓存(file_store或memcached)执行此操作,我首先需要Marshal.dump文件,但是在序列化文件时会产生1000毫秒的延迟,在序列化时会产生400毫秒的延迟。 理想情况下,我希望能够在100毫秒内从每个进程保存和加载此哈希。 一个想法是生成一个新的Ruby进程来保存这个哈希,为其他进程提供API来修改或处理其中的数据,但我想避免这样做,除非我确定没有其他方法可以共享这个对象很快。 有没有一种方法可以更直接地在进程之间共享此哈希,而无需序列化或反序列化它? 这是我用来生成类似于我正在使用的哈希的代码: @a = [] 0.upto(500) do |r| @a[r] = [] 0.upto(10_000) do |c| if rand(10) == 0 @a[r][c] = 1 # 10% chance of being 1 else @a[r][c] = 0 end end end @c = Marshal.dump(@a) # 1000 milliseconds Marshal.load(@c) # 400 milliseconds 更新: […]

如何使用RubyInline将ruby数组转换为C数组?

我有一个函数比较2个字符串char by char。 我需要它比在Ruby中运行得快得多,所以我使用RubyInline来重写C中的函数。它确实将速度提高了大约100倍。 该函数如下所示: require ‘inline’ inline do |builder| builder.c ” static int distance(char *s, char *t){ … }” end 但是我需要比较unicode字符串。 所以我决定使用unpack(“U *”)并比较整数数组。 我无法从一个简短的文档中找出RubyInline如何将ruby数组传递给函数以及如何将它们转换为C数组。 任何帮助表示赞赏!

Ruby C扩展API问题

所以,最近我不幸地需要为Ruby做一个C扩展(因为性能)。 由于我在理解VALUE时遇到了问题(现在仍然如此),所以我查看了Ruby源代码并发现: typedef unsigned long VALUE; ( 链接到Source ,但你会注意到还有一些其他’方法’已经完成,但我认为它基本上是一个long ;如果我错了,请纠正我)。 因此,在进一步调查时,我发现了一篇有趣的博文 ,其中说: “……在某些情况下,VALUE对象可能是数据,而不是指向数据。” 令我困惑的是,当我尝试从Ruby传递字符串到C时,并使用RSTRING_PTR(); 在VALUE (从Ruby传递给C函数),并尝试使用strlen();进行’调试’ strlen(); 它返回4. 总是 4。 示例代码: VALUE test(VALUE inp) { unsigned char* c = RSTRING_PTR(inp); //return rb_str_new2(c); //this returns some random gibberish return INT2FIX(strlen(c)); } 此示例始终返回1作为字符串长度: VALUE test(VALUE inp) { unsigned char* c = (unsigned char*) inp; //return rb_str_new2(c); // […]

如何从图像中读取条形码

我正在寻找关于如何从图像中读取EAN-13条形码的图书馆,技术或建议(包括ISBN和ISSN编码)。 图像将来自手机或网络摄像头,因此分辨率可能非常差,并且没有很好地对齐。 我特别感兴趣的是可以在ruby轨道上使用的东西,但欢迎使用其他语言的答案。 首选开源解决方案。 迄今领先的解决方案: ZBar (以前称为Zebra -h / t @bgbg,@ Natim) – 在C中实现,带有Python,Perl和C ++接口 ZXing (h / t @codr) – 用Java(J2SE和Android)实现,其他模块/端口处于不同的开发状态(JavaME,C#,C ++,JRuby,RIM,iPhone / Objective C)