例:
var o = {};
for(var i = 0; i < 5; i++) {
o[i] = function () {
console.log(i);
};
}
o[3]();
Run Code Online (Sandbox Code Playgroud)
当我调用o3时,它总是在控制台上显示5,即使我调用o0,o4或其中任何一个.它将始终显示5,因为这是我的最后一个值.如何在创建匿名函数时显示i的值?在o3中应该在控制台中显示3.
将整数数组转换为枚举内联元素的字符串的最简单方法是什么?我在想像执行转换的匿名函数.
var array = new int[] { 1, 2 }
var s = string.Format("{0}",
new []
{ /*inline transform array into the string "1, 2"*/ });
Run Code Online (Sandbox Code Playgroud) 我有一个存储匿名函数的文件funcs.m.它们必须可以被目录中的文件使用.目前,我使用匿名函数,以便我funcs.m在不同的文件中执行该文件,但我认为这是一种错误的做事方式.其他函数如main.m及其嵌套函数nest.m需要使用funcs.m中的匿名函数.我认为路径不会解决这个问题,因为文件在同一个文件夹中.基本上我可以通过将匿名函数复制粘贴到每个文件来解决这个问题,但代码闻起来如此:
有没有办法在Matlab中重用具有anon函数的funcs.m?
例
的main.m
Run Code Online (Sandbox Code Playgroud)function main funcs; % loads the anonymous functions nest(par1,...,parN) endnest.m
Run Code Online (Sandbox Code Playgroud)function nest(par1,...,parN) funcs; %ERRR: This fires err, why? Look: this was sourced already in main.m! function neededOnlyHere(par100) bq(q,A) %This needs the functions of the funcs end neededOnlyHere(somePar) %ERR to use the anon funcs from funcs end函数main.m和nest.m使用此函数funcs.m具有匿名函数
Run Code Online (Sandbox Code Playgroud)bq=@(q,A) q*A; %Bolded q I=@(ii,jj,A) find(A(ii,:)==1 & A(jj,:)==0); AiNotj=zeros(1,Ncut); ...错误
Run Code Online (Sandbox Code Playgroud)Attempt to add "bq" to a static workspace. See MATLAB Programming, Restrictions on Assigning to …
我知道什么是闭包,什么是lambda函数,但我想知道它的名称是什么:
>>> def foo(a, b):
>>> return a + b
>>>
>>> bar = foo
>>> bar(1, 1)
>>> 2
Run Code Online (Sandbox Code Playgroud)
我只是想知道在变量中绑定函数的事实
我试图通过按钮点击来创建我的所有代码,在后台工作程序中运行.所以我有以下代码模板.
BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += delegate
{
//code
};
backgroundWorker.RunWorkerAsync();
while (backgroundWorker.IsBusy)
{
Application.DoEvents();
}
Run Code Online (Sandbox Code Playgroud)
只是想知道是否有一种简化此代码的方法,所以我没有有效地为所有按钮复制相同的代码块.
编辑:我试图运行的典型代码是:
//Synchronous task
Wait(2000);
//Synchronous task
return taskResult ? "Success" : "Failure"
Run Code Online (Sandbox Code Playgroud) 也许这听起来很荒谬,但对于我来说,仍然不能完全清楚#匿名函数应该来自何处.例如,在此示例中,我过滤了正数的除数:
(filter #(zero? (mod 6 %)) (range 1 (inc 6))) ;;=> (1 2 3 6)
Run Code Online (Sandbox Code Playgroud)
但是在它# 之前放右(mod 6 %)会导致错误.在这种情况下我的匿名函数是否开始有规则,为什么要在此#之前出现(zero? ...?
我正在将一些代码从Julia 0.4.7移植到0.5.1.我注意到有一些与匿名函数数组不兼容的东西.代码在这里:
f = x::Array{Function} -> size(x)
# Option 1
f([k -> k+1, k-> k+1]) # This works in 0.4 & 0.5
# Option 2
f(repmat([k -> k+1], 2)) # This only works in 0.4
Run Code Online (Sandbox Code Playgroud)
据我所知,区别在于虽然在0.4中匿名数组仍然在内部被视为数组{Function,1},但在0.5中它看起来像数组{#11#12,1}(数字可能会改变),所以然后它引发一个MethodError,因此它们不匹配.
虽然这个例子很愚蠢但它显示了我真正需要的东西:复制匿名函数的次数可变.
谢谢!
我有一组匿名函数,我想将它们转换为字符串.通常我会使用func2str,但问题是我希望变量和内部函数扩展到它们的"真实"值.我遇到的问题是MATLAB通过名称保留它们,但是识别这些值.例
classdef Bclass
properties
equation
end
function obj = Bclass(inEquation, inValue)
obj.equation = @(t,y) inEquation(t,y) * inValue;
end
function out = getStr(obj)
out = func2str(obj.equation);
end
end
Run Code Online (Sandbox Code Playgroud)
问题是,当我真的希望它输出类似的东西时,如果我们说过,那么func2str调用正在输出.@(t,y) inEquation(t,y) * inValue@(t,y) t*y * 5b = Bclass(@(t,y) t*y, 5)
有没有办法从MATLAB中检索这些变量值?
借用Javascript一词,在perl中IIFE的“最佳实践”方法是什么?
我下面的测试代码是一个简单的循环,它调用匿名子程序并立即执行以构建子程序数组(这仅返回循环索引)。这主要是我想要的,但是我需要使用一个中间变量(而不是使用@_,它会在内部函数上更改)。
use warnings;
use strict;
my @funcs;
for(my $i=0;$i<3;$i++) {
sub {
my $index=shift;
$funcs[$index]=sub {$index};
}
-> ($i);
}
for (@funcs) {
print &$_()."\n";
}
Run Code Online (Sandbox Code Playgroud)
#Output
0
1
2
Run Code Online (Sandbox Code Playgroud)
我知道我可以map用来重组这个问题。但撇开这一点,有没有更好的方法可以做到这一点?
更新资料
感谢@ikegami突出了一些要点。
仅出于对这个问题的未来看法,我对此有以下看法:
“迭代器” for循环的作用域(是否是地图?)与“ c样式” for循环的作用域不同。这样就完全不需要IIFE即可清理代码。甜。
更新2
以下代码显示了我所看到的差异。我并不是说一个比另一个更好,但是很高兴知道。我的输出是0 1 2,但第一个仅重复$ i的最后一个值(++运算符后为3)。
use warnings;
use strict;
my @funcs;
print "C loop direct assignment of sub\n";
for(my $i=0;$i<3;$i++) {
$funcs[$i]= sub {$i};
}
print &$_()."\n" for @funcs;
print "C loop direct assignment of sub with variable\n";
for(my …Run Code Online (Sandbox Code Playgroud)