小编Tha*_*gan的帖子

模式匹配Scala案例类仅捕获一个字段

我有一个针对具有大量字段的案例类的匹配语句。我是否能够按名称捕获其中一个字段并忽略其余字段而不用下划线指定其他字段?当我想要的东西嵌套得很深时,这尤其难以做到。

这是我现在所拥有的:

record match {
  case MyRecordType(_, _, _, MyNestedType(_, _, namedFieldAsVar, _), _, _, _) => 
    doStuffWith(namedFieldAsVar)
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情:

record match {
  case MyRecordType { nested = MyNestedType { namedFieldAsVar } } => 
    doStuffWith(namedFieldAsVar)
}
Run Code Online (Sandbox Code Playgroud)

其他语言支持像下面这样的模式匹配(Rust),Scala 是否提供类似的东西?

match record {
  MyRecordType { named_field_as_var, .. } => do_stuff_with(named_field_as_var)
}
Run Code Online (Sandbox Code Playgroud)

scala pattern-matching

5
推荐指数
0
解决办法
195
查看次数

当lambda执行时,C++ lambda捕获的引用具有不同的值

我正在为一个项目构建一个pubsub系统,我有一个有趣的问题,事件值在通知和事件发送之间变化.我遇到问题的事件是一个MouseMoveEvent,其中包含使用glm :: vec2()的屏幕坐标(它有双重类型的x和y字段).

template<class E>
void notify_event(std::shared_ptr<E> event) {
  if (_auto_dispatch) {
    dispatch<E>(event);
  } else {
    // inspecting values here gives expected coordinates: 
    // like: 168.684,284.547
    debug<E>(event); 
    _dispatch_queue.push([&]() {
      // when the lambda runs, the coordinates are major messed up
      // like: -1.82767e+16,4.57398e-41
      debug<E>(event); 
      dispatch<E>(event);
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

无论输入值如何,都给出-1.82767e + 16,4.57398e-41坐标.我最初使用引用传递事件,然后尝试共享指针,但我得到两个完全相同的结果.调度事件立即运行没有任何问题,但我的项目要求我收集事件,然后稍后调度,因为不同的系统将在创建事件时处于"准备好"的各种状态.

我觉得捕获的事件引用最终以某种方式指向垃圾内存,但我不太清楚C++中的lambdas,知道我为什么会看到它.

发生了什么事,有什么选择可以解决这个问题?

c++ c++14

0
推荐指数
1
解决办法
69
查看次数

标签 统计

c++ ×1

c++14 ×1

pattern-matching ×1

scala ×1