我想做以下事情:
for (var i = 0; i < 10; ++i) {
createButton(x, y, function() { alert("button " + i + " pressed"); }
}
Run Code Online (Sandbox Code Playgroud)
这个问题是我总是得到最终值,i因为Javascript的闭包不是按值.
那么我怎么能用javascript做到这一点?
所以在数据库字段中有一个php函数.这是它的样子:
'$put_fname_fn = function($filename) {
return $filename.'.Z';
};'
Run Code Online (Sandbox Code Playgroud)
我正在执行它:
$code = fetchFromDatabase(); // Get the function string
eval($code);
$put_fname_fn('MYFILE.TXT'); // Convert it to MYFILE.TXT.Z
Run Code Online (Sandbox Code Playgroud)
是否有更优雅的方式来调用用户功能?我尽量避免使用eval,但我没有其他方法来做到这一点.
可能重复:
立即执行匿名函数
我想立即评估一个匿名函数,而不是它在方法args中作为Closure对象出现.这可能吗?
例如:
$obj = MyClass;
$obj->Foo(function(){return "bar";}); // passes a Closure into Foo()
$obj->Foo(function(){return "bar";}()); // passes the string "bar" into Foo()?
Run Code Online (Sandbox Code Playgroud)
第3行是非法语法 - 有没有办法做到这一点?
谢谢
我以前从未在PHP中使用过匿名函数,但是我发现了一段代码,它使用一个代码来排序对象
usort($numTurnsPerUser,build_sorter('turns'));
function build_sorter($key) {
return function ($a, $b) use ($key) {
return strnatcmp($a[$key], $b[$key]);
};
}
Run Code Online (Sandbox Code Playgroud)
此代码将通过键对对象进行排序(我传入"turn").例如,一个看起来像这样的对象:(用JSON编写,只是为了便于阅读)
$numTurnsPerUser = {
"31":{
"turns":15,
"order":0
}, "36":{
"turns":12,
"order":1
}, "37":{
"turns":14,
"order":2
}
}
Run Code Online (Sandbox Code Playgroud)
将被分类为如下所示的对象:
$numTurnsPerUser = {
"36":{
"turns":12,
"order":1
}, "37":{
"turns":14,
"order":2
}, "31":{
"turns":15,
"order":0
}
}
Run Code Online (Sandbox Code Playgroud)
这在我的运行PHP 5.3.0的本地服务器上运行良好,但它无法在我的在线服务器上运行,运行"php5" - 我无法找到除此之外的任何信息.我收到了一个错误
解析错误:语法错误,意外T_FUNCTION
我读到PHP <5.3不能使用匿名函数,必须使用create_function,但匿名函数的"use"部分让我难以理解.有人可以向我解释一下该功能的"使用"部分是什么,或者更好的是,我如何将其"翻译"到所需的create_function参数?
我正在尝试清理用于初始化静态只读变量的代码。
原来的:
public static readonly List<int> MyList;
//Initialize MyList in the static constructor
static MyObject() { ... }
Run Code Online (Sandbox Code Playgroud)
清理:
public static readonly List<int> MyList = GetMyList();
//Returns the list
private static List<int> GetMyList() { ... }
Run Code Online (Sandbox Code Playgroud)
public static readonly List<int> MyList =
() =>
{
...
return list;
};
Run Code Online (Sandbox Code Playgroud)
我试图将GetMyList()方法中的代码放入匿名委托中以返回要分配的列表,但它说我正在尝试将 adelegate转换为List<int>?
我希望能够将一个函数一般地传递给C 中的一个函数。我已经使用 C 几年了,我知道实现正确的闭包和高阶函数的障碍。这几乎是不可逾越的。
我搜索了 StackOverflow 以查看其他消息来源对此事的看法:
...除了使用可变参数或程序集之外,没有人有一个银弹一般的答案。我没有汇编的骨头,但如果我能在宿主语言中有效地实现一个特性,我通常会尝试。
我喜欢高阶函数,但我会在紧要关头满足于委托。我怀疑通过类似下面的代码,我可以在 C 中获得一个可行的委托实现。
想到了这样的实现:
enum FUN_TYPES {
GENERIC,
VOID_FUN,
INT_FUN,
UINT32_FUN,
FLOAT_FUN,
};
typedef struct delegate {
uint32 fun_type;
union function {
int (*int_fun)(int);
uint32 (*uint_fun)(uint);
float (*float_fun)(float);
/* ... etc. until all basic types/structs in the
program are accounted for. */
} function;
} delegate; …Run Code Online (Sandbox Code Playgroud) 我有两个列表:L和E.我尝试编写一个函数,它返回另一个列表,其中包含L中元素的出现次数.
-module(mymodule).
-export([count/2]).
-export([numberOfOccurences/2]).
count([Head|Tail], Counter) ->
fun(Element) -> if
[Head|Tail] == [] -> Counter;
Element == Head -> count(Tail, Counter + 1);
Element /= Head -> count(Tail, Counter)
end
end.
numberOfOccurences(L, E) ->
lists:map(count(L, 0), E).
Run Code Online (Sandbox Code Playgroud)
mymodule:numberOfOccurences[1,2,"abc",2,1,"abc",4,1,1], [1,2,3,"abc"])应该回来[4,2,0,2].但它返回一个包含4个函数的列表.我究竟做错了什么?
erlang closures functional-programming list anonymous-function
我是定点组合器世界的新手,我猜他们已经习惯了匿名的lambdas,但我还没有真正使用它们,甚至无法完全绕过它们.
我在Javascript中看到了Y-combinator的例子,但是还没能成功运行它.
这里的问题是,有人可以给出一个直观的答案:
奖励积分:如果示例不仅仅是一种语言,最好也是在Clojure中.
更新:
我已经能够在Clojure中找到一个简单的例子,但仍然发现很难理解Y-Combinator本身:
(defn Y [r]
((fn [f] (f f))
(fn [f]
(r (fn [x] ((f f) x))))))
Run Code Online (Sandbox Code Playgroud)
虽然这个例子很简洁,但我发现很难理解函数中发生了什么.提供的任何帮助都是有用的.
functional-programming y-combinator anonymous-function higher-order-functions fixpoint-combinators
我被 MATLAB 中的分段错误难住了。它似乎是由从 mat 文件加载的匿名函数引起的。最初的匿名函数句柄是:
@(x)scaledNlfun(x,@logexp1,1e3)
Run Code Online (Sandbox Code Playgroud)
但是当它加载时,它变成了:
@sf%1@(x)scaledNlfun(x,@logexp1,1e3)
Run Code Online (Sandbox Code Playgroud)
似乎没问题,当我在命令行中调用它时,但它会在函数中创建分段错误(或分段违规)。不是函数调用本身,而是之后的几行。在调试模式下,如果我单步执行语句,也没有问题。
堆栈跟踪显示一堆
[ 0] 0x00002b20b97baba4 /usr/local/MATLAB/R2013a/bin/glnxa64/libmwm_interpreter.so+04127652
Run Code Online (Sandbox Code Playgroud)
它发生在 Linux 2.6.18-371.3.1.el5 SMP 上的 MATLAB 2012a 和 2013a 上。
此函数句柄使用“-v7.3”选项保存在parfor循环中,因为包含句柄的结构太大。如果我在加载 mat 文件后替换匿名函数,一切正常,所以我认为 matlabload函数有一个错误。
不幸的是,我无法创建一个最小的示例来重现错误。我尝试使用“-v7.3”在 parfor 中保存匿名函数句柄,但没有其他复杂的数据结构,它似乎工作正常。但是我有 80 个 mat 文件,它们会可靠地使 matlab 崩溃(其中许多超过 1GB)。
无论如何,有人知道“@sf%”是什么意思吗?(这不是 stateflow 工具箱)
我注意到在Julia中使用匿名函数会导致性能下降.为了说明我有两个quicksort实现(取自Julia发行版中的微观性能基准).第一种按升序排序
function qsort!(a,lo,hi)
i, j = lo, hi
while i < hi
pivot = a[(lo+hi)>>>1]
while i <= j
while a[i] < pivot; i += 1; end
while pivot < a[j]; j -= 1; end
if i <= j
a[i], a[j] = a[j], a[i]
i, j = i+1, j-1
end
end
if lo < j; qsort!(a,lo,j); end
lo, j = i, hi
end
return a
end
Run Code Online (Sandbox Code Playgroud)
第二个需要一个额外的参数:一个匿名函数,可用于指定升序或降序排序,或比较更奇特的类型
function qsort_generic!(a,lo,hi,op=(x,y)->x<y)
i, j = lo, hi
while i < hi
pivot = …Run Code Online (Sandbox Code Playgroud)