其实我也不知道怎么说才算准确。
今天,我浏览了以下页面:
http://siliconframework.org/docs/hello_world.html
我发现了以下语法:
GET / _hello = [] () { return D(_message = "Hello world."); }
我发现“GET”可以是 lambda 表达式的函数,但我无法弄清楚“/”和“_hello”在这里是什么意思,以及它们如何连接到有意义的东西。
还有,那个“_message =”是什么?
顺便说一句,我的主要 C++ 知识是在 C++11 之前。
我用谷歌搜索了很多。
哪位大侠能解释一下吗?
最佳答案
这个库使用所谓的嵌入式领域特定语言,它以允许看似不同的语言成为 C++ 程序的另一部分的方式扭曲 C++ 和预处理器语法。
简而言之,魔法。
魔法的第一点在于:
iod_define_symbol(hello)
这是一个生成标识符 _hello 的宏类型 _hello_t .
它还创建了一个 _hello_t继承自名为 iod::symbol<_hello_t> 的 CRTP 助手的类型.
_hello_t覆盖各种运算符(包括 operator= 和 operator/ ),它们不会执行您通常期望 C++ 对象的行为。
GET / _hello = [] () { return D(_message = "Hello world."); }
所以这个调用
operator=(
operator/( GET, _hello ),
/* lambda_goes_here */
);
同样在 lambda 中:
D(_message = "Hello world.");
是
D( operator=(_message, "Hello world.") );
operator/和 operator= 几乎可以做任何事情。
在D案例,=不做任何分配——相反,它构建了一个结构,基本上说“名为 "message" 的字段被分配了值 "Hello world."。
_message知道它叫"message"因为它是由宏 iod_define_symbol(message) 生成的他们把字符串 message 放在哪里并将其存储为 _message_t 类型,并创建变量 _message这是该类型的一个实例。
D获取许多这样的键/值对并将它们捆绑在一起。
lambda 返回这个包。
所以 [] () { return D(_message = "Hello world."); }是一个返回一组键值对附件的 lambda,以一种奇怪的方式编写。
然后我们调用 operator=与 GET/_hello在左侧。
GET是另一个全局对象 operator/重载了。我没有追踪到它。假设它的类型是 iod::get_t (这个名字是我编的:再一次,我没有查过它是什么类型的,这并不重要)
然后iod::get_t::operator/(iod::symbol<T> const&)重载以生成另一种辅助类型。此类型获取 T的名称(在本例中为 "hello" ),并等待它被 lambda 赋值。
当分配给时,它不会按照您的预期进行。相反,它会关闭并在 "hello" 之间建立关联。并调用该 lambda,其中该 lambda 预计会返回一组由 D 生成的键值对.
然后我们将一个或多个这样的关联传递给 http_api ,它收集这些包并构建运行具有这些查询和响应的 Web 服务器所需的数据,可能包括表示“我将成为一个 http 服务器”的标志。
sl::mhd_json_serve然后获取该数据和一个端口号,并实际运行一个网络服务器。
所有这些都是一堆抽象层,以便更容易进行一些思考。生成的结构都有 C++ 标识符和类似的字符串。其中暴露了类似的字符串,当生成 json 序列化(或反序列化)代码时,这些字符串用于读取/写入 json 值。
宏的存在只是为了让编写样板文件更容易。
如果您想了解这里发生的事情,可能有助于进一步阅读的技术包括“表达式模板”、“反射”、“CRTP”、嵌入式“领域特定语言”。
上面的一些内容包含轻微的“对 child 说的谎言”——特别是,运算符语法并不像我暗示的那样有效。 ( a/b 不等同于 operator/(a,b) ,因为第二个不会调用成员运算符 / 。了解它们只是函数是我想要的,而不是语法是一样。)
@mattheiuG(该框架的作者)已分享 these slides在这篇文章下方的评论中进一步解释了D和 _message代币和框架。
关于C++ 函数斜杠运算符 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37431714/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
@raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://