小编omn*_*nse的帖子

127
推荐指数
10
解决办法
18万
查看次数

迭代Go中结构的字段

基本上,迭代a字段值的唯一方法(我知道)struct是这样的:

type Example struct {
    a_number uint32
    a_string string
}

//...

r := &Example{(2 << 31) - 1, "...."}:
for _, d:= range []interface{}{ r.a_number, r.a_string, } {
  //do something with the d
}
Run Code Online (Sandbox Code Playgroud)

我想知道,如果有更好,更通用的实现方式[]interface{}{ r.a_number, r.a_string, },所以我不需要单独列出每个参数,或者,是否有更好的方法来循环结构?

我试图透过reflect包裹看,但是我碰了一堵墙,因为我不知道一旦取回就该做什么reflect.ValueOf(*r).Field(0).

谢谢!

go go-reflect

81
推荐指数
4
解决办法
9万
查看次数

什么是递归?它是如何工作的?

有人可以解释究竟什么是递归(以及它如何在Ruby中工作,如果这不是太多要求).我遇到了一个依赖递归的冗长代码片段,它使我感到困惑(我现在丢失它,并不完全相关).

ruby recursion

19
推荐指数
3
解决办法
4万
查看次数

Rubinus或MRI 1.9.3(YARV)?

所以,我有一些问题要问我,我确实浏览了互联网,但没有太多可靠的答案.大多数博客帖子会相互取消,因为他们都赞扬了不同的东西,并有基准来"证明他们的观点"(在我的生活中,我从未见过如此多的矛盾基准).

无论如何,我的问题是:

  • 鲁宾尼斯真的快吗?这个显然诚实的亲Rubinius演讲让我印象深刻.另一件令我困惑的事情是,很多Rubinius都是用Ruby编写的,但不知何故它比C-Ruby更快?那一定是一个非常好的语言实现!
  • EventMachine是否与Ruinius一起使用?据我所知,EventMachine部分依赖Fibers(纠正我,如果我错了),直到1.9才实现.我知道Rubinius最终也会支持1.9; 我不介意等一下.
  • C扩展是否适用于Rubinius?我编写了一个C扩展,它将从TCP流接收的二进制消息"序列化"到Ruby对象中,反之亦然(我想这些细节并不重要,但如果它有助于回答这个问题,我会更新帖子).这可能是很多消息!我设法在Ruby中编写相同的代码(尽管在一个月之后它没有什么意义),但事实证明它在应用程序中是一个真正的瓶颈.所以,我不得不使用C作为我的问题的"解决方案". 编辑:我记得,我使用C进行另一项任务,它是阵列的命中测试方法.基本上它只是检查一个"点"是否在一个多边形内部,它在CRuby中是不可能的慢.
  • 如果之前的答案是"否",那么在Rubinus有C替代吗?我收集的VM是用C++编写的,那么.

一些"奖金"问题:

  • C-Ruby(2.0 +,YARV)是否会摆脱GIL?或者至少修改它以便CRuby支持真正的并行性?
  • 什么是mruby我看到matz正在研究它,就描述而言,它看起来非常棒.与CRuby(性能方面)有何不同?

我为你发动的这场文字风暴道歉!♥

ruby rubinius yarv ruby-1.9

17
推荐指数
1
解决办法
3948
查看次数

Ruby C扩展API问题

所以,最近我不幸地需要为Ruby做一个C扩展(因为性能).由于我是有了解的问题VALUE(和仍然),所以我看着Ruby源代码,并发现:typedef unsigned long VALUE;(链接到源代码,但你会发现,有它做了一些其他的"方式",但我认为它本质上是一个long; 如我错了请纠正我).因此,在进一步调查时,我发现了一篇有趣的博文,其中说:

"......在某些情况下,VALUE对象可能是数据,而不是指向数据."

是什么让我困惑的是,当我试图将一个字符串在Ruby传递到C,并使用RSTRING_PTR();VALUE(通过在Ruby的C函数),并尝试"调试"它与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));
}
Run Code Online (Sandbox Code Playgroud)

此示例始终返回1作为字符串长度:

VALUE test(VALUE inp) {
    unsigned char* c = (unsigned char*) inp;
    //return rb_str_new2(c); // Always "\x03" in Ruby.
    return INT2FIX(strlen(c));
}
Run Code Online (Sandbox Code Playgroud)

有时在ruby中我看到一个异常,说"无法将模块转换为字符串"(或者沿着这些行, 但是我正在弄乱代码,试图解决这个问题,我现在无法重现错误当我尝试时会发生错误StringValuePtr();[我有点不清楚这究竟是做什么的.文档说它将传递的参数更改为char*inp):

VALUE test(VALUE inp) {
    StringValuePtr(inp);
    return …
Run Code Online (Sandbox Code Playgroud)

c ruby ruby-c-extension

16
推荐指数
2
解决办法
3506
查看次数

如何在Ruby中查找类的每个实例

有没有办法在Ruby中获取某个类的所有对象?

澄清:

class Pokemon
end

pikatchu = Pokemon.new
charmander = Pokemon.new
Run Code Online (Sandbox Code Playgroud)

那么,有没有办法可以以某种方式检索引用那两个对象(pikatchucharmander)?

我实际上想过通过初始化把它全部推到一个类数组中,但这可能会变大,我假设可能有一个原生的Ruby方法.

ruby reflection

15
推荐指数
1
解决办法
3005
查看次数

在SDL 2中获取Contiunous Window Resize事件

我使用以下结构来获取调整大小的SDL窗口的新宽度和高度.但是使用这种结构,我只能在完成调整大小后才能获得新数据,即完成拖动并释放鼠标按钮.如何连续获取新数据,就在我拖动窗口的时候.

if (sdl_set->GetMainEvent()->type == SDL_WINDOWEVENT)
{
  if (sdl_set->GetMainEvent()->window.event == SDL_WINDOWEVENT_RESIZED)
  {
    ScreenWidth = sdl_set->GetMainEvent()->window.data1;
    ScreenHeight = sdl_set->GetMainEvent()->window.data2;
    cout << "Window Resized!" << endl;
  }
}
Run Code Online (Sandbox Code Playgroud)

c++ sdl-2

14
推荐指数
1
解决办法
3647
查看次数

如何在案例中"突破"......在Ruby中

所以,我试过了break,next而且return.它们都会出错,exit当然有效,但完全退出.那么,一个人怎么会case...when"太快"?

例:

case x
    when y; begin
        <code here>
        < ** terminate somehow ** > if something
        <more code>
    end
end
Run Code Online (Sandbox Code Playgroud)

(上面是某种形式的伪代码,只是为了给出我所要求的一般概念[开始...结束时使用了希望break可行].

而且,虽然我在这里,是否有更优雅的方式传递块case...when

ruby switch-statement control-flow

13
推荐指数
3
解决办法
1万
查看次数

每个连接的线程与Reactor模式(带有线程池)?

我想写一个简单的多人游戏作为我的C++学习项目的一部分.

所以我想,既然我在这里,我想做得恰到好处,而不是仅仅完成它.

如果我理解正确:Apache使用每个连接的线程架构,而nginx使用事件循环,然后为传入连接专用一个worker [x].我想nginx更明智,因为它支持更高的并发级别.对?

我也遇到过这个聪明的比喻,但我不确定它是否适用于我的情况.这个比喻似乎也很理想主义.我很少看到我的电脑以100%的CPU运行(即使打开了一个不常见的Chrome标签,Photoshop也没有同时运行)

此外,我遇到了一个SO帖子(不知何故,它从我的历史中消失了)用户询问他们应该使用多少线程,其中一个答案是拥有大约700个,甚至多达10,000个线程是完全可以接受的.不过,这个问题与JVM有关.

所以,让我们估计一个虚拟的用户群,大约有5000个用户.哪种方法应该是"最并发"的方法?

  1. 在一个线程中运行所有内容的reactor模式.
  2. 带有线程池的反应器模式(大概,你建议线程池应该有多大?
  3. 每个连接创建一个线程,然后销毁连接关闭的线程.

我承认选项2听起来对我来说是最好的解决方案,但我在所有这些方面都非常环保,所以我可能有点天真并且缺少一些明显的缺陷.而且,听起来它可能相当难以实现.

PS:我正在考虑使用POCO C++库.建议任何替代库(如boost)都可以.然而,许多人说POCO的图书馆非常干净且易于理解.所以,我最好使用一个,这样我就可以了解如何我使用的是什么样的秒.

c++ poco-libraries

13
推荐指数
2
解决办法
9697
查看次数

如何正确地将unsigned char数组转换为uint32_t

所以,我正在尝试将unsigned chars 数组转换为a uint32_t,但每次都会得到不同的结果:

unsigned char buffer[] = {0x80, 0x00, 0x00, 0x00};;
uint32_t num = (uint32_t*)&buffer;
Run Code Online (Sandbox Code Playgroud)

现在,我一直收到这个警告:

警告:初始化从指针生成整数而不进行强制转换

当我改变num*numi 时,我没有得到那个警告,但这实际上并不是真正的问题(更新:嗯,现在我认为它们可能是相关的.),因为每次运行代码都有不同的结果.其次num,一旦它正确投射,应该是128,但是如果我需要改变缓冲区的字节顺序,我可以设法自己做,我想.

谢谢!

c casting

12
推荐指数
2
解决办法
3万
查看次数