我正在尝试解决匿名函数变得更加容易的问题,并且想知道这是否可以在c ++中实现.
我想做的是(基本上)
template<typename T>
T DoSomething(T one, function<T(T)> dosomething)
{
return one + dosomething(5);
}
void GetMyVal(...)
{
DoSomething<int>(1, /*anonymous func here*/)
}
Run Code Online (Sandbox Code Playgroud)
对于我必须做的事情,这个例子非常非常简单.在C#中我会做p => p*5.我知道这很容易用C++ 0x,但我不能用它.我觉得我应该能够使用boost :: lambda,或使用占位符的boost :: bind和boost :: function的组合,但我似乎无法让它工作.这可能是不可能的,这也很好,但如果不可能请回答.谢谢.
编辑:好吧,似乎int的简单情况工作正常,一个更复杂的结构怎么样?所以,试试吧
struct NumHolder
{
int x;
}
template<typename T>
T DoSomething(T one, function<T(NumHolder)> dosomething)
{
NumHolder temp;
temp = 5
return one + dosomething(temp);
}
void GetMyVal(...)
{
DoSomething<int>(1, /*anonymous func here*/)
}
Run Code Online (Sandbox Code Playgroud)
这里我的C#表达式将与p => p.temp*5一致.这是否可以在C++中使用boost进行?
编辑2:好的,现在我只是好奇:D如何调用lambda表达式中的函数?所以,如果我们有
int ChangeVal(int mult)
{
return mult*5;
}
struct NumHolder …Run Code Online (Sandbox Code Playgroud) 我从JS世界来到AS3,我应该承认匿名函数是我的弱点.我倾向于到处使用它们.现在,来到AS3我已经听过很多地方的内容,AS和Flash在处理垃圾收集时非常糟糕,应该清空,处理和删除所有事件处理程序和对象,以避免奇怪和无法解释的内存泄漏崩溃.不确定这部分是什么,但我想从一开始就遵循最佳实践.
所以我的问题是 - 使用匿名函数作为事件处理程序的想法有多糟糕?考虑一下这样的代码:
addEventListener(Event.ENTER_FRAME, function() : void {
controls.elapsed = stream.time;
});
Run Code Online (Sandbox Code Playgroud)
contorls.elapsed是setter,除了设置视频播放器的当前播放时间外,还更新整个UI,stream是NetStream对象,它传输实际视频.
还有很多其他地方匿名功能可以使代码更清晰,更直观.检查以下代码以获得控制栏的简单淡入效果:
public function showControls() : void
{
var self:Controls = this;
if (!visible) {
visible = true;
fadeTimer = new Timer(30, 10);
fadeTimer.addEventListener(TimerEvent.TIMER, function() : void {
self.alpha += 0.1;
});
fadeTimer.addEventListener(TimerEvent.TIMER_COMPLETE, function() : void {
self.alpha = 1;
});
fadeTimer.start();
}
}
Run Code Online (Sandbox Code Playgroud)
我完全喜欢它的外观和适合代码,但我担心泄漏.虽然Event.ENTER_FRAME处理程序可能永远不会在这种形式中变得有害,但计时器监听器呢.我应该手动删除这些侦听器,还是一旦我设置fadeTimer = null就会自动删除它们?是否可以正确删除具有匿名功能的侦听器?
在我继续努力学习scala的过程中,我正在通过Odersky的'示例Scala'和第一类函数的章节,关于匿名函数的部分避免了递归匿名函数的情况.我有一个似乎有效的解决方案.我很好奇是否有更好的答案.
从pdf:Code来展示更高阶的功能
def sum(f: Int => Int, a: Int, b: Int): Int =
if (a > b) 0 else f(a) + sum(f, a + 1, b)
def id(x: Int): Int = x
def square(x: Int): Int = x * x
def powerOfTwo(x: Int): Int = if (x == 0) 1 else 2 * powerOfTwo(x-1)
def sumInts(a: Int, b: Int): Int = sum(id, a, b)
def sumSquares(a: Int, b: Int): Int = sum(square, a, b)
def sumPowersOfTwo(a: Int, b: Int): Int …Run Code Online (Sandbox Code Playgroud) 作为一个实验(因为我正在从用户数据生成匿名函数),我运行了以下MATLAB代码:
h = @(x) x * x
h = @(x) x * x
h(3)
ans = 9
h = @(x) h(x) + 1
h = @(x)h(x)+1
h(3)
ans = 10
Run Code Online (Sandbox Code Playgroud)
基本上,我自己做了一个匿名函数调用.MATLAB没有采用递归方式,而是记住了旧的函数定义.但是,工作空间不会将其显示为变量之一,并且句柄似乎也不知道它.
只要我保留新功能,旧功能是否会存储在幕后?这种结构有"陷阱"吗?
我没有一个特定的问题,只是希望加深我对Silex正在发生的事情的理解以及一些新的PHP功能.这是基于Silex文档"使用"页面上的代码示例:
$blogPosts = array(
1 => array(
'date' => '2011-03-29',
'author' => 'igorw',
'title' => 'Using Silex',
'body' => '...', );
$app->get('/blog/{id}', function (Silex\Application $app, $id) use ($blogPosts) {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
问题
将the $app和$idas作为参数传递给函数,并使用 -ing $blogPosts变量有什么区别?
可能$blogPosts也已通过了作为参数的函数?
use ($app).使用 -ing $app和传递它是一个参数有什么区别?我对这里讨论的问题有一个后续问题: Laravel核心方法混淆
我与driechel(上面提到的问题的作者)的情况相同,目前已经习惯了Laravel 4 FW并检查了核心.虽然给出了一个精确的答案,但我仍然不了解逻辑和幕后发生的事情.所以我非常感谢进一步的解释.我知道这可能是重复的,但由于我无法发表评论,我会用一个新问题给它一个镜头.希望这样好.
从本文开始,我一直在从另一个角度看这个:http: //blog.joynag.net/2013/05/facades-in-laravel-4-and-static-methods-resolution/
在检查调用时,File:get()我最终在Container类的share函数中结束,该函数使用此实际参数调用share(function() { return new Filesystem; }.
我无法弄清楚的是使用$container.特别是在关闭时的第二次出现:
$object = $closure($container);
你能再次澄清一下吗?为什么$container在此处作为参数传递以及实际包含在其中的内容?据我所知$closure,保持并执行function() { return new Filesystem; }没有输入参数.
我搞不清楚了.现在研究这个和PHP匿名函数/闭包连续两天仍然无法弄明白.我既不理解$closure($container)这里的语法也不理解逻辑.
我想调用一个匿名函数而不为它声明一个变量.
我知道这是一个有效的例子:
$foo = function ($bar) use ($foo) {
if (is_array($bar)) {
foreach ($bar AS $current) {
$foo($current);
}
}
else {
print($bar);
}
};
$foo($input);
# Unset variable cause we won't need it anymore
# and we like to have a lot of free memory.
unset($foo);
Run Code Online (Sandbox Code Playgroud)
但是我想自动调用它并取消它:
call_user_func(function ($bar) {
if (is_array($bar)) {
foreach ($bar AS $current) {
# This won't work
# as our function doesn't have any name.
call_user_func(__FUNCTION__, $current);
}
}
else {
print($bar);
}
}, …Run Code Online (Sandbox Code Playgroud) 使用deal我们可以编写具有多个输出参数的匿名函数,例如
minmax = @(x)deal(min(x),max(x));
[u,v] = minmax([1,2,3,4]); % outputs u = 1, v = 4
Run Code Online (Sandbox Code Playgroud)
但是如果你想为优化函数提供一个具有渐变的函数,那么fminunc这不起作用.该函数 (编辑:这不是真的,你只需要指定你是否真的想要使用渐变,使用例如fminunc有时会调用输入函数,有时会调用两个输出参数.optimset('SpecifyObjectiveGradient',true).然后在一次调用中它总是要求相同数量的参数.)
我们必须提供类似的东西
function [f,g] = myFun(x)
f = x^2; % function
g = 2*x; % gradient
Run Code Online (Sandbox Code Playgroud)
可以使用一个或两个输出参数调用.
那么有没有办法在不使用function关键字的情况下进行同样的内联?
matlab anonymous-function variadic-functions function-handle output
我在多态类中具有以下成员,Parent并且我正在寻找一种替换foo为某种虚拟成员的方法bar:
void Parent::myFunc() {
// lots of variables
// complicated calculations
while (/* loop condition */) {
// more variables and calculations
auto foo = [&](int n) {/* ... */};
foo(42);
// want to replace with virtual
// bar(42);
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是foo捕获了所有内容,而且我不知道授予bar相同访问权限的正确方法。
baras参数会导致参数列表很大,这似乎不是一个很好的解决方案myFunc()转换成的成员Parent,但这会不必要地延长这些变量的寿命,尤其是对于循环变量。我正在移植这个 Python 代码...
with open(filename, 'r') as f:
results = [np.array(line.strip().split(' ')[:-1], float)
for line in filter(lambda l: l[0] != '#', f.readlines())]
Run Code Online (Sandbox Code Playgroud)
……给朱莉娅。我想出了:
results = [map(ss -> parse(Float64, ss), split(s, " ")[1:end-1])
for s in filter(s -> s[1] !== '#', readlines(filename))];
Run Code Online (Sandbox Code Playgroud)
这种移植的主要原因是潜在的性能提升,所以我在 Jupyter notebook 中对两个片段进行了计时:
%%timeit...
12.8 ms ± 44.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)@benchmark返回(除其他外)mean time: 8.250 ms (2.62% GC)。到现在为止还挺好; 我确实得到了性能提升。@time: …