基本上,迭代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).
谢谢!
有人可以解释究竟什么是递归(以及它如何在Ruby中工作,如果这不是太多要求).我遇到了一个依赖递归的冗长代码片段,它使我感到困惑(我现在丢失它,并不完全相关).
所以,我有一些问题要问我,我确实浏览了互联网,但没有太多可靠的答案.大多数博客帖子会相互取消,因为他们都赞扬了不同的东西,并有基准来"证明他们的观点"(在我的生活中,我从未见过如此多的矛盾基准).
无论如何,我的问题是:
一些"奖金"问题:
我为你发动的这场文字风暴道歉!♥
所以,最近我不幸地需要为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) 有没有办法在Ruby中获取某个类的所有对象?
澄清:
class Pokemon
end
pikatchu = Pokemon.new
charmander = Pokemon.new
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法可以以某种方式检索引用那两个对象(pikatchu和charmander)?
我实际上想过通过初始化把它全部推到一个类数组中,但这可能会变大,我假设可能有一个原生的Ruby方法.
我使用以下结构来获取调整大小的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) 所以,我试过了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?
我想写一个简单的多人游戏作为我的C++学习项目的一部分.
所以我想,既然我在这里,我想做得恰到好处,而不是仅仅完成它.
如果我理解正确:Apache使用每个连接的线程架构,而nginx使用事件循环,然后为传入连接专用一个worker [x].我想nginx更明智,因为它支持更高的并发级别.对?
我也遇到过这个聪明的比喻,但我不确定它是否适用于我的情况.这个比喻似乎也很理想主义.我很少看到我的电脑以100%的CPU运行(即使打开了一个不常见的Chrome标签,Photoshop也没有同时运行)
此外,我遇到了一个SO帖子(不知何故,它从我的历史中消失了)用户询问他们应该使用多少线程,其中一个答案是拥有大约700个,甚至多达10,000个线程是完全可以接受的.不过,这个问题与JVM有关.
所以,让我们估计一个虚拟的用户群,大约有5000个用户.哪种方法应该是"最并发"的方法?
我承认选项2听起来对我来说是最好的解决方案,但我在所有这些方面都非常环保,所以我可能有点天真并且缺少一些明显的缺陷.而且,听起来它可能相当难以实现.
PS:我正在考虑使用POCO C++库.建议任何替代库(如boost)都可以.然而,许多人说POCO的图书馆非常干净且易于理解.所以,我最好使用一个,这样我就可以了解如何我使用的是什么样的秒.
所以,我正在尝试将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,但是如果我需要改变缓冲区的字节顺序,我可以设法自己做,我想.
谢谢!
ruby ×5
c ×2
c++ ×2
casting ×1
control-flow ×1
dom ×1
go ×1
go-reflect ×1
html ×1
recursion ×1
reflection ×1
rubinius ×1
ruby-1.9 ×1
sdl-2 ×1
yarv ×1