- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读关于 Anthony Williams website 的博客文章当我以某种方式漫游到他的 just::thread 库的示例时,他的 barber shop example .
在其中他有一系列不继承任何东西的结构:
struct start_haircut {};
struct no_room {};
struct shop_closed {};
然后他有一个 receive
他将 .match()
模板链接到的函数:
jss::actor::receive()
.match<start_haircut>(
[&](start_haircut){
//...
})
.match<no_room>(
[&](no_room){
//...
})
.match<shop_closed>(
[&](shop_closed)
{
//...
});
接收函数返回一个 unspecified_message_receiver
对象,该对象指定类型(shop_closed
等)和 lambda 处理程序。
receive
和 match
函数里面有什么? receive
和 match
函数如何交互?
这是一个有趣的模式,可以在使用它的线程模型之外应用程序。我对它在传感器之间通过 tcp 进行通信很感兴趣,其中小消息包和少量数据被连续传输。
最佳答案
这看起来(不出所料)像 Erlang。
这在您链接和引用的文档中有非常清楚的描述。
The receive function returns an
unspecified_message_receiver
object
所以 jss::actor::receive()
是一个 unspecified_message_receiver
,
Calling
match()
on a receiver adds the specifiedMsgType
to the list of handled messages, and registers the specified handler to be called when a message of that type is received.
所以
.match<start_haircut>(
[&](start_haircut){
//...
})
在先前返回的接收器中注册 lambda 以处理 start_haircut
类型的消息。
由于每个 match
都会返回一个消息接收者,您可以将它们链接起来以注册更多处理程序。
我不确定还能说些什么来澄清,但更现实的用途可能是使用某些类型来携带某种有效载荷,例如
struct start_haircut { enum { Long, Short, Shaved } style; };
jss::actor::receive()
.match<start_haircut>(
[&](start_haircut cut){
switch (cut.style)
{
case start_haircut::Long:
// ...
}
})
.match<no_room>(
[&](no_room){
//...
})
.match<shop_closed>(
[&](shop_closed)
{
//...
});
(如果您看一下 Erlang 教程,例如 "Learn you some Erlang for great good!",这种界面可能更有意义)。
关于c++ - 这种模式如何运作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38975414/
我是一名优秀的程序员,十分优秀!