现在似乎有不少主流语言支持函数文字.它们也被称为匿名函数,但我不在乎它们是否有名称.重要的是函数文字是一个表达式,它产生一个尚未在别处定义的函数,因此例如在C中,&printf不计算.
编辑添加:如果你有一个真正的函数文字表达式<exp>,你应该能够将它传递给一个函数f(<exp>)或立即将它应用于一个参数,即.<exp>(5).
我很好奇哪些语言可以让你编写递归的函数文字.维基百科的" 匿名递归 "文章没有给出任何编程示例.
我们以递归因子函数为例.
以下是我所知道的:
JavaScript/ECMAScript可以用callee:
function(n){if (n<2) {return 1;} else {return n * arguments.callee(n-1);}}
Run Code Online (Sandbox Code Playgroud)在语言方面很容易letrec,例如Haskell(称之为let):
let fac x = if x<2 then 1 else fac (x-1) * x in fac
Lisp和Scheme中有等价物.请注意,绑定fac是表达式的局部,因此整个表达式实际上是一个匿名函数.
还有其他人吗?
recursion language-features function-literal anonymous-function letrec
假设我想从一个返回两个输出的m文件函数创建一个匿名函数.是否可以设置匿名函数,使其仅返回m文件函数的第二个输出?
示例:ttest2返回两个输出,t/f和概率.如果我想使用t检验cellfun,我可能只对收集概率感兴趣,即我想写这样的东西
probabilities = cellfun(@(u,v)ttest2(u,v)%take only second output%,cellArray1,cellArray2)
Run Code Online (Sandbox Code Playgroud) 具体来说,我想写这个:
public Func<IList<T>, T> SelectElement = list => list.First();
Run Code Online (Sandbox Code Playgroud)
但我得到一个语法错误T.我不能拥有通用的匿名方法吗?
我对matlab很新,但我知道如何为循环和匿名函数做两件事.现在我想结合这些.
我想写:
sa = @(c) for i = 1:numel(biscs{c}), figure(i), imshow(biscs{c}{i}.Image), end;
但这是无效的,因为matlab似乎只想要换行符作为命令分隔符.我的代码以清晰的方式编写(没有函数头):
for i = 1:numel(biscs{c})
figure(i)
imshow(biscs{c}{i}.Image)
end
Run Code Online (Sandbox Code Playgroud)
我寻找一个解决方案,我可以用一个匿名函数在一行中编写它,就像我的第一个例子.如果我可以用另一种方式创建该函数,我也会很高兴,只要我不需要一个新的函数m文件.
如果我在全球范围内写这个:
(function(){})();
Run Code Online (Sandbox Code Playgroud)
是在执行语句后立即执行和销毁语句时创建的匿名函数?
如果我在函数中写这个:
function foo()
{
var a=1;
(function(){})();
a++;
}
Run Code Online (Sandbox Code Playgroud)
匿名函数在foo返回之前是否存在,或者只是在执行该语句期间存在?
在MATLAB中调试时,我使用匿名函数进行诊断打印.例如,
debug_disp = @(str) disp(str);
debug_disp('Something is up.')
...
debug_disp = @(str) disp([]);
% diagnostics are now hidden
Run Code Online (Sandbox Code Playgroud)
使用disp([])"狼吞虎咽"似乎对我来说有点脏; 有更好的选择吗?明显的(?)方法不起作用:
debug_disp = @(str) ;
Run Code Online (Sandbox Code Playgroud)
我认为这可以用于其他功能语言应用程序,而不仅仅是诊断打印.
是否可以访问被引用的类/对象self,static以及$thisPHP中的匿名回调?像这样:
class Foo {
const BAZ = 5;
public static function bar() {
echo self::BAZ; // it works OK
array_filter(array(1,3,5), function($number) /* use(self) */ {
return $number !== self::BAZ; // I cannot access self from here
});
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让它像通常的变量一样使用use(self)子句?
我正在读这本书,它有这个代码示例
function getFunction() {
var result = [];
for (var i = 0; i < 10; i++) {
result[i] = function(num) {
return function() {
console.log("this is " + num);
}
}(i);
};
return result;
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但为什么这里的匿名函数没有包含在这样的括号中(function(...))(i);?在哪些情况下可以在匿名函数中省略括号?
Kotlin有两种声明匿名函数的方法(也就是lambda).两种不同的语法是:
val lambda = { input : String ->
"received ${string}"
}
Run Code Online (Sandbox Code Playgroud)
和
val anonymousFunction = fun (input : String): String {
return "received ${string}"
}
Run Code Online (Sandbox Code Playgroud)
我理解两者之间的区别(如本答案中所述),但我不明白的是为什么语言有两种不同的方式来声明同一件事.
对于另一个经验,是否在工作中有优化?匿名函数版本是否过于冗长?lambda版本的语法不支持返回类型吗?