只在本地使用 lambda 可以吗?
Is it ok to use lambda just locally?
是否可以定义一个只在本地使用的 lambda 函数,即在当前块中 (function/method)?考虑某些代码将被执行多次的情况(因此将其放入函数中是合乎逻辑的)但它永远不会在块外使用。
void foo() {
auto bar = []() {
// some code applicable only inside foo()
};
bar();
bar();
bar();
}
与将 bar()
声明为普通函数相比,这种方法的优点和缺点是什么?
如果这样做的选项可用,那么是的,将 lambda bar
本地化到特定函数。
在 C++ 中,我们总是尽量将对象保持在本地。 (使代码更易于理解,简化文档,促进重构,&c. &c..)
你可以的。主要问题是它会更具可读性吗?把它放在外面可以减少一级缩进。
你应该问的问题:
- bar是短函数吗?
- 是纯函数,还是修改了什么?
- 它是否与 foo 紧密相关,或者可以在其他地方重复使用?
- 你想要另一个级别的缩进吗?
我同意这是一个很好的做法。高级逻辑几乎总是比低级逻辑更容易阅读。我经常这样写函数:
void foo()
{
// introduce actors here
auto something = make_something();
// introduce detailed definitions
auto bing = [&]()->bool { ... }; // define what binging means
auto bong = [&]() { ... }; // define what bonging means
// perform logic
while (bing())
bong();
}
请记住,从 c++17 开始,lambda 表达式默认为 constexpr
。海湾合作委员会等阿尔。经常完全优化它们。 None 这是性能方面的考虑。
从 correctness/standard 的角度来看,这当然可以。除此之外,这个问题主要是 opinion-based.
Lambda 是 C++ 中的众多工具之一。他们在 "copy-paste for reuse"(代码味道)和 "extract it into a function" 之间添加了另一层结构。我个人喜欢 function-local lambdas 正是出于所列目的:您正在重用一小段仅在此函数范围内有意义的代码。
有人认为它仍然应该是它自己的函数(因为你所有的函数都是 5 行或更短的,对吧?好吧,我对此表示怀疑......)。特别是,如果您想重用该 lambda 代码,它应该绝对 是它自己的函数。但在此之前,值得考虑将此代码 放在使用位置旁边 的好处,而不是滚动屏幕或更多屏幕。此外,这两种方法都为操作命名,但 lambda 需要较少的写入开销(例如私有成员函数膨胀)。在同一页上,将私有成员函数添加到 header 会触发重新编译,而在 .cpp
中添加 lambda 则不会。
最后,考虑什么可以使代码最具可读性。如果使用 lambda 或将其提取到函数中在代码清晰度上的差异很小(并非不可能),那么 编写 代码的便利性开始变得重要,为此,上述考虑来自开始玩了。
至于测试,这取决于你想fine-grained如何测试。像 return a && b && (a == b);
这样的 lambda 表达式真的需要测试吗?如果它只是内联使用(即不提取为 lambda 或函数),您会测试它吗?在某些时候它变成了浪费时间,但是在 SO 答案中不可能确定这一点。
这没有错,实际上这是 lambda 的一大优势:您可以在需要的地方本地定义它们,而不必编写仿函数类型。如果您想 define/declare 在尽可能小的范围内处理您的内容,那么 lambda 是您的朋友。
你甚至可以更进一步,做这样的事情:
auto bar = []() {return true;}();
它定义了 lambda 并在一行中调用它。
是否可以定义一个只在本地使用的 lambda 函数,即在当前块中 (function/method)?考虑某些代码将被执行多次的情况(因此将其放入函数中是合乎逻辑的)但它永远不会在块外使用。
void foo() {
auto bar = []() {
// some code applicable only inside foo()
};
bar();
bar();
bar();
}
与将 bar()
声明为普通函数相比,这种方法的优点和缺点是什么?
如果这样做的选项可用,那么是的,将 lambda bar
本地化到特定函数。
在 C++ 中,我们总是尽量将对象保持在本地。 (使代码更易于理解,简化文档,促进重构,&c. &c..)
你可以的。主要问题是它会更具可读性吗?把它放在外面可以减少一级缩进。
你应该问的问题:
- bar是短函数吗?
- 是纯函数,还是修改了什么?
- 它是否与 foo 紧密相关,或者可以在其他地方重复使用?
- 你想要另一个级别的缩进吗?
我同意这是一个很好的做法。高级逻辑几乎总是比低级逻辑更容易阅读。我经常这样写函数:
void foo()
{
// introduce actors here
auto something = make_something();
// introduce detailed definitions
auto bing = [&]()->bool { ... }; // define what binging means
auto bong = [&]() { ... }; // define what bonging means
// perform logic
while (bing())
bong();
}
请记住,从 c++17 开始,lambda 表达式默认为 constexpr
。海湾合作委员会等阿尔。经常完全优化它们。 None 这是性能方面的考虑。
从 correctness/standard 的角度来看,这当然可以。除此之外,这个问题主要是 opinion-based.
Lambda 是 C++ 中的众多工具之一。他们在 "copy-paste for reuse"(代码味道)和 "extract it into a function" 之间添加了另一层结构。我个人喜欢 function-local lambdas 正是出于所列目的:您正在重用一小段仅在此函数范围内有意义的代码。
有人认为它仍然应该是它自己的函数(因为你所有的函数都是 5 行或更短的,对吧?好吧,我对此表示怀疑......)。特别是,如果您想重用该 lambda 代码,它应该绝对 是它自己的函数。但在此之前,值得考虑将此代码 放在使用位置旁边 的好处,而不是滚动屏幕或更多屏幕。此外,这两种方法都为操作命名,但 lambda 需要较少的写入开销(例如私有成员函数膨胀)。在同一页上,将私有成员函数添加到 header 会触发重新编译,而在 .cpp
中添加 lambda 则不会。
最后,考虑什么可以使代码最具可读性。如果使用 lambda 或将其提取到函数中在代码清晰度上的差异很小(并非不可能),那么 编写 代码的便利性开始变得重要,为此,上述考虑来自开始玩了。
至于测试,这取决于你想fine-grained如何测试。像 return a && b && (a == b);
这样的 lambda 表达式真的需要测试吗?如果它只是内联使用(即不提取为 lambda 或函数),您会测试它吗?在某些时候它变成了浪费时间,但是在 SO 答案中不可能确定这一点。
这没有错,实际上这是 lambda 的一大优势:您可以在需要的地方本地定义它们,而不必编写仿函数类型。如果您想 define/declare 在尽可能小的范围内处理您的内容,那么 lambda 是您的朋友。
你甚至可以更进一步,做这样的事情:
auto bar = []() {return true;}();
它定义了 lambda 并在一行中调用它。