对于一个没有计算机科学背景的人来说,计算机科学界的lambda是什么?
当前回答
有点过于简单:lambda函数是一个可以传递给其他函数的函数,它的逻辑被访问。
在C#中,lambda语法通常以与匿名委托相同的方式编译为简单方法,但它也可以分解并读取其逻辑。
例如(在C#3中):
LinqToSqlContext.Where(
row => row.FieldName > 15 );
LinqToSql可以读取该函数(x>15)并将其转换为实际的SQL以使用表达式树执行。
上述声明变为:
select ... from [tablename]
where [FieldName] > 15 --this line was 'read' from the lambda function
这与普通方法或匿名委托不同(它们实际上只是编译器的魔法),因为它们无法读取。
并非C#中所有使用lambda语法的方法都可以编译为表达式树(即实际的lambda函数)。例如:
LinqToSqlContext.Where(
row => SomeComplexCheck( row.FieldName ) );
现在无法读取表达式树-无法分解SomeComplexCheck。SQL语句将在没有where的情况下执行,数据中的每一行都将通过SomeComplexCheck进行处理。
Lambda函数不应与匿名方法混淆。例如:
LinqToSqlContext.Where(
delegate ( DataRow row ) {
return row.FieldName > 15;
} );
这也有一个“内联”函数,但这一次它只是编译器的魔法——C#编译器会将其拆分为一个具有自动生成名称的新实例方法。
匿名方法不能被读取,因此逻辑不能像lambda函数那样被翻译出来。
其他回答
在CS的上下文中,lambda函数是一个抽象的数学概念,它解决了数学表达式的符号求值问题。在这种情况下,lambda函数与lambda项相同。
但在编程语言中,这是不同的。这是一段被宣布为“到位”的代码,可以作为“一流公民”传递。这个概念似乎很有用,因此它几乎进入了所有流行的现代编程语言(参见lambda函数everwhere post)。
我很难理解lambda表达式,因为我在Visual FoxPro中工作,它具有宏替换以及ExecScript{}和Evaluate()函数,这两个函数似乎起着相同的作用。
? Calculator(10, 23, "a + b")
? Calculator(10, 23, "a - b");
FUNCTION Calculator(a, b, op)
RETURN Evaluate(op)
使用正式lambda的一个明确好处是(我假设)编译时检查:Fox在尝试运行之前不会知道您是否键入了上面的文本字符串。
这对于数据驱动的代码也很有用:您可以将整个例程存储在数据库中的备注字段中,然后在运行时对其求值。这允许您调整应用程序的一部分,而无需实际访问源代码。(但这完全是另一个话题。)
lambda函数可以接受任意数量的参数,但它们只包含一个表达式。。。Lambda函数可用于返回函数对象。语法上,lambda函数仅限于一个表达式。
我喜欢这篇文章中对Lambdas的解释:LINQ的演变及其对C#设计的影响。这对我来说很有意义,因为它为Lambdas展示了一个真实的世界,并将其作为一个实际的例子。
他们的快速解释:Lambdas是将代码(函数)视为数据的一种方式。
想象一下,你有一家餐厅提供送货服务,你的订单需要在30分钟内完成。关键是客户通常不在乎你是骑自行车送食物还是赤脚送食物,只要你保持食物的温度并系好。因此,让我们将这个习惯用法转换为带有匿名和定义的传输函数的Javascript。
下面我们定义了交付的方式,也就是我们定义了函数的名称:
// ES5
var food = function withBike(kebap, coke) {
return (kebap + coke);
};
如果我们使用箭头/lambda函数来完成此传输会怎么样:
// ES6
const food = (kebap, coke) => { return kebap + coke };
你看,对客户来说并没有什么区别,也并没有浪费时间去思考如何发送食物。只要发送它。
顺便说一句,我不推荐用可乐烤串,这就是为什么上面的代码会给你错误。玩得高兴