js如何使用正则表达式表达式

在cad中如何使用表达式
cad命令行提示输入数据时,怎样能使用表达式?例如偏移图线时,偏移距离输入 5.67+3.28+9 这样的式子?
提示输入偏移距离时,先在英文输入状态下,在命令行里输入&'cal&,空格,然后再输入你要用的式子就可以了。
我来说两句 ()
CAD视频教程
Copyright & 2007 - 2012
All Rights Reserved.
E-mail: 手机:Linux系统技术交流QQ群(915246)验证问题答案:刘遄
一直以来在查对条件是否匹配时,我们使用的都是简单的表达式。那如果你想用超过一个表达式来查对特定的条件呢?本文中,我们将看看如何在过滤文本和字符串时,结合多个表达式,即复合表达式,用以查对条件。
awk 的复合表达式可由表示“与”的组合操作符“ &” 和表示“或”的“|| ”构成。
复合表达式的常规写法如下:
( 第一个表达式 ) & ( 第二个表达式 )
这里只有当“第一个表达式” 和“第二个表达式”都是真值时整个表达式才为真。
( 第一个表达式 ) || ( 第二个表达式)
这里只要“第一个表达式” 为真或“第二个表达式”为真,整个表达式就为真。
注意:切记要加括号。
表达式可以由比较操作符构成。
现在让我们通过一个例子来加深理解:
此例中,有一个文本文件 tecmint_deals.txt,文本中包含着一张随机的 Tecmint 交易清单,其中包含了名称、价格和种类。
TecMint Deal List
Mac_OS_X_Cleanup_Suite
Basics_Notebook
Tactical_Pen
Nano_Tool_Pack
Ditto_Bluetooth_Altering_Device
Nano_Prowler_Mini_Drone
我们只想打印出价格超过 $20 且其种类为 “Tech” 的物品,在其行末用 (*) 打上标记。
我们将要执行以下命令。
# awk '($3 ~ /^/$[2-9][0-9]*/.[0-9][0-9]$/) && ($4=="Tech") { printf "%s/t%s/n",$0,"*"; } ' tecmint_deals.txt
Ditto_Bluetooth_Altering_Device
Nano_Prowler_Mini_Drone
此例,在复合表达式中我们使用了两个表达式:
表达式 1:($3 ~ /^/$[2-9][0-9]*/.[0-9][0-9]$/) ;查找交易价格超过 $20 的行,即只有当 $3 也就是价格满足 /^/$[2-9][0-9]*/.[0-9][0-9]$/ 时值才为真值。
表达式 2:($4 == “Tech”) ;查找是否有种类为 “Tech”的交易,即只有当 $4 等于 “Tech” 时值才为真值。 切记,只有当 && 操作符的两端状态,也就是两个表达式都是真值的情况下,这一行才会被打上 (*) 标志。
有些时候为了真正符合你的需求,就不得不用到复合表达式。当你掌握了比较和复合表达式操作符的用法之后,复杂的文本或字符串过滤条件也能轻松解决。
原文来自:
本文地址:编辑员:苏西云,审核员:岳永
为您推荐一些与本文相关的文章:
进阶课程目录
第24章 使用Xen与Kvm部署虚拟化服务环境。(即将公布)
Linux技术交流QQ群
向每个正在奋斗的Linuxer致敬.
Linux技术交流群A:560843
Linux技术交流群B:340829
Linux技术交流群C:463590
Linux技术交流群D:915246
Linux技术交流群E:1663106
Linux技术交流群F:1653851
Linux技术交流群G:2632018
Linux技术交流群H:2636170
Linux技术交流群I:2650582
全国Linux技术交流群(总):
9月0 篇文章10月0 篇文章11月0 篇文章12月0 篇文章
1月0 篇文章12月0 篇文章6423人阅读
条件表达式
Scala的if/else语法结构和Java或C++一样。不过,在Scala中if/else表达式有值,这个值就是跟在if或else之后的表达式的值。例如:
if (x & 0) 1 else -1
上述表达式的值是1或-1,具体是哪一个取决于x的值。你可以将if/else表达式的值赋值给变量:
val s = if (x & 0) 1 else -1
这与如下语句的效果一样:
if (x & 0) s = 1 else s = -1
不过,第一种写法更好,因为它可以用来初始化一个val。而在第二种写法当中,s必须是var。
(之前已经提过,Scala中的分号绝大多数情况下不是必需的。)
Java和C++有一个?:操作符用于同样目的。如下表达式
x & 0 ? 1 : -1 // Java或C++
等同于Scala表达式 if (x & 0) 1 else -1。不过,你不能在?:表达式中插入语句。Scala的if/else将在Java和C++中分开的两个语法结构if/else和?:结合在了一起。
在Scala中,每个表达式都有一个类型。举例来说,表达式 if (x & 0) 1 else -1的类型是Int,因为两个分支的类型都是Int。混合类型表达式,比如:
if (x & 0) &positive& else -1
上述表达式的类型是两个分支类型的公共超类型。在本例中,其中一个分支是java.lang.String,而另一个分支是Int。它们的公共超类型叫做Any。(详细内容参见8.11节。)
如果else部分缺失了,比如:
if (x & 0) 1
那么有可能if语句没有输出值。但是在Scala中,每个表达式都应该有某种值。这个问题的解决方案是引入一个Unit类,写做()。不带else的这个if语句等同于
if (x & 0) 1 else ()
你可以把()当做是表示“无有用值”的占位符,将Unit当做Java或C++中的void。(从技术上讲,void没有值但是Unit有一个表示“无值”的值。如果你一定要深究的话,这就好比空的钱包和里面有一张写着“没钱”的无面值钞票的钱包之间的区别。)
说明:Scala没有switch语句,不过它有一个强大得多的模式匹配机制,我们将在第14章中看到。在现阶段,用一系列的if语句就好。
注意:REPL比起编译器来更加“近视”——它在同一时间只能看到一行代码。
举例来说,当你键入如下代码时:
if (x & 0) 1
else if (x == 0) 0 else -1
REPL会执行 if (x & 0) 1,然后显示结果。之后它看到接下来的else关键字就会不知所措。
如果你想在else前换行的话,用花括号:
if (x & 0) { 1
} else if (x == 0) 0 else -1
只有在REPL中才会有这个顾虑。在被编译的程序中,解析器会找到下一行的else。
提示:如果你想在REPL中粘贴成块的代码,而又不想担心REPL的近视问题,可以使用粘贴模式。键入:
把代码块粘贴进去,然后按下Ctrl+D。这样REPL就会把代码块当做一个整体来分析。
在Java和C++中,每个语句都以分号结束。而在Scala中——与JavaScript和其他脚本语言类似——行尾的位置不需要分号。同样,在}、else以及类似的位置也不必写分号,只要能够从上下文明确地判断出这里是语句的终止即可。
不过,如果你想在单行中写下多个语句,就需要将它们以分号隔开。例如:
if (n & 0) { r = r * n -= 1 }
我们需要用分号将 r = r * n 和 n -= 1 隔开。由于有},在第二个语句之后并不需要写分号。
如果你在写较长的语句,需要分两行来写的话,就要确保第一行以一个不能用做语句结尾的符号结尾。通常来说一个比较好的选择是操作符:
s = s0 + (v - v0) * t + // +告诉解析器这里不是语句的末尾
0.5 * (a - a0) * t * t
在实际编码时,长表达式通常涉及函数或方法调用,如此一来你并不需要过分担心——在左括号(之后,编译器直到看到匹配的)才会去推断某处是否为语句结尾。
正因如此,Scala程序员们更倾向于使用Kernighan & Ritchie风格的花括号:
if (n & 0) {
以{结束的行很清楚地表示了后面还有更多内容。
许多来自Java或C++的程序员一开始并不适应省去分号的做法。如果你倾向于使用分号,用就是了——它们没啥坏处。
块表达式和赋值
在Java或C++中,块语句是一个包含于{ }中的语句序列。每当你需要在逻辑分支或循环中放置多个动作时,你都可以使用块语句。
在Scala中,{ }块包含一系列表达式,其结果也是一个表达式。块中最后一个表达式的值就是块的值。
这个特性对于那种对某个val的初始化需要分多步完成的情况很有用。例如,
val distance = { val dx = x - x0; val dy = y - y0; sqrt(dx * dx + dy * dy) }
{ }块的值取其最后一个表达式,在此处以粗体标出。变量dx和dy仅作为计算所需要的中间值,很干净地对程序其他部分而言不可见了。
在Scala中,赋值动作本身是没有值的——或者,更严格地说,它们的值是Unit类型的。你应该还记得,Unit类型等同于Java和C++中的void,而这个类型只有一个值,写做()。
一个以赋值语句结束的块,比如
{ r = r * n -= 1}
的值是Unit类型的。这没有问题,只是当我们定义函数时需要意识到这一点。
由于赋值语句的值是Unit类型的,别把它们串接在一起。
x = y = 1 // 别这样做
y = 1的值是(),你几乎不太可能想把一个Unit类型的值赋值给x。(与此相对应,在Java和C++中,赋值语句的值是被赋的那个值。在这些语言中,将赋值语句串接在一起是有意义的。)
输入和输出
如果要打印一个值,我们用print或println函数。后者在打印完内容后会追加一个换行符。举例来说,
print(&Answer: &)
println(42)
与下面的代码输出的内容相同:
println(&Answer: & + 42)
另外,还有一个带有C风格格式化字符串的printf函数:
printf(&Hello, %s! You are %d years old.\n&, &Fred&, 42)
你可以用readLine函数从控制台读取一行输入。如果要读取数字、Boolean或者是字符,可以用readInt、readDouble、readByte、readShort、readLong、readFloat、readBoolean或者readChar。与其他方法不同,readLine带一个参数作为提示字符串:
val name = readLine(&Your name: &)
print(&Your age: &)
val age = readInt()
printf(&Hello, %s! Next year, your will be %d.\n&, name, age + 1)
本文节选自《快学Scala》
电子工业出版社出版
(美)霍斯曼(Horstmann,C.S.)著
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3525214次
积分:49240
积分:49240
排名:第63名
原创:1421篇
转载:83篇
评论:2874条
(5)(8)(20)(22)(13)(21)(15)(14)(4)(21)(4)(5)(4)(6)(9)(4)(6)(4)(7)(7)(5)(8)(13)(3)(7)(4)(9)(10)(8)(7)(23)(16)(4)(17)(13)(8)(29)(23)(4)(21)(23)(14)(23)(11)(12)(16)(12)(22)(20)(25)(26)(31)(47)(33)(7)(11)(7)(14)(27)(26)(14)(19)(32)(20)(19)(19)(30)(27)(5)(20)(19)(20)(17)(18)(38)(26)(44)(40)(38)(30)(21)(24)(52)(30)(15)(10)(1)(2)(10)(7)
() () () () () () ()966,690 七月 独立访问用户
语言 & 开发
架构 & 设计
文化 & 方法
您目前处于:
表达式即编译器
表达式即编译器
日. 估计阅读时间:
智能化运维、Serverless、DevOps......2017年有哪些最新运维技术趋势?!
相关厂商内容
相关赞助商
CNUTCon全球运维技术大会,9月10日-9月11日,上海&光大会展中心大酒店,
而且,在动态代码的需求变复杂时,情况则会更加糟糕。
当然,一个明显的应对方式是&不要使用反射&&&例如,手动(或使用代码生成工具)为每个类型写一个方法来做对应的事情。表面看来这种简单的做法没有问题,但是这会导致大量的重复代码,而且也无助于我们使用编译期间还不可知的类型。
我们需要的是某种形式的元编程(meta-programming)API。幸运的是,在.NET 2.0中提供Reflection.Emit来动态编写IL(Java&二进制码(bytecode)&在.NET中的对应物),不过这也要求开发人员直接处理所有细微的装箱、类型转换、调用堆栈细节或操作符&提升&等操作&&简而言之,你需要了解大量本不需要知道的CLI内容。另一个选择是 CodeDom,不过这也是一种显式的代码生成方式,我们想要的做的事情往往会淹没在大量构造CodeDom所需要的繁琐事务中。
我们需要的是一种折衷的方案,一种足够高的抽象让我们不必关心实际的IL如何,但也不能过于高级:我们的代码想要尽可能的简单并富于表现力。
背景:走近System.Linq.Expressions.Expression
微软在.NET 3.5中引入了LINQ。LINQ的关键部分之一(尤其是在访问数据库等外部资源的时候)是将代码表现为表达式树的概念。这种方法的可用领域非常广泛,例如我们可以这样筛选数据:
var query = from cust in customers
where cust.Region == &North&
虽然从代码上看不太出彩,但是它和下面使用Lambda表达式的代码是完全一致的:
var query = customers.Where(cust =& cust.Region == &North&);
LINQ以及Where方法细节的关键之处,便是Lambda表达式。在LINQ to Object中,Where方法接受一个Func&T, bool&类型的参数&&它是一个根据某个对象(T)返回true(表示包含该对象)或false(表示排除该对象)的委托。然而,对于数据库这样 的数据源来说,Where方法接受的是Expression&Func&T, bool&&参数。它是一个表示测试规则的表达式树,而不是一个委托。
这里的关键点,在于我们可以构造自己的表达式树来应对各种不同场景的需求&&表达式树还带有编译为一个强类型委托的功能。这让我们可以在运行时轻松编写IL。
那么,什么是一个表达式树?
与一般情况下C#编译得到的IL不同,一个Lambda表达式会被编译为一个表现代码逻辑的对象模型。于是,例如数据库提供者(provider)便可以观察这个对象模型,理解我们编写代码的目的,在必要时便可以将这种目的转化为其他形式(如T-SQL)。
我们不妨独立观察先前的Lambda表达式:
Expression&Func&Customer, bool&& filter =
cust =& cust.Region == &North&;
如果要观察编译器做的事情,我们需要如平时般编译示例代码(Lambda表达式),然后在强大(且免费)的中查看&&不过在此之前,我们要将.NET 3.5 (C# 3.0)优化选项关闭。
然后观察反编译器的输出内容,就会发现一些原本应该由我们自己编写的C#代码:
请注意,虽然编译器直接访问了MemberInfo对象,并且使用了非法的变量名&&所以你无法直接让这些输出编译通过,它只是用来参考的。有趣的是,事 实上C#语言规范中并没有指明编译器是如何将代码转化为表达式树的,因此,使用编译结果作为参考实现,是为数不多的可用于研究表达式树的方法之一。
为了研究表达式树的手动编写方法,我们需要把相等性判断(==)和成员访问(.)视为接受运算对象的普通方法:
Expression&Func&Customer, bool&& filter =
cust =& Equal(Property(cust,&Region&),&North&);
我们现在可以构建一个相同的,接受Customer类型作为参数,判断其Region属性是否为字符串&North&,并返回一个布尔值的表达式树。
// declare a parameter of type Customer named cust
ParameterExpression cust = Expression.Parameter(
typeof(Customer), &cust&);
// compare (equality) the Region property of the// parameter against the string constant &North&
BinaryExpression body = Expression.Equal(
Expression.Property(cust, &Region&),
Expression.Constant(&North&, typeof(string)));
// formalise this as a lambda
Expression&Func&Customer, bool&& filter =
Expression.Lambda&Func&Customer, bool&&(body, cust);
最后的&Lambda&语句是将表达式树标准化为一个完全独立的单元,并包含一系列(这个例子中只有一个)用于表达式树内部的参数。如果我们传入一个Lambda内不存在的参数,则会抛出一个异常。
一个表达式树,其实只是一个表现我们意图的不可变的对象模型:
filter (lambda)
parameter: Customer: &cust&
body (binary)
method: equals
left (member)
member: &Region&
expression: &cust& parameter
right (constant)
string: &North&
在获得一个完整的表达式树之后,我们可以将其交由LINQ提供者处理(此时它就会被真正当作一颗&树&来处理了),或者把它编译为一个委托&&即动态生成所需的IL:
Func&Customer, bool& filterFunc = pile();
现在我们向委托对象中传入一个Customer实例并返回一个布尔值。
这看上去有些麻烦,但已经远比使用Reflection.Emit的方式来的简单了,尤其在一些较为复杂的情况下(如装箱)。
重要:将一个表达式树编译为委托对象涉及到动态代码的生成。如果想要获得最佳的性能,你应该仅编译一次&&将其储存起来(如放在一个字段中)并复用多次。
Expression的妙用
到目前为止,我们只是观察了一个用C#就能完成的简单示例&&这自然没什么大不了的。所以我们现在来看一些C#无法做到的东西&&我经常被人问及,有什么 方法可以编写一个通用的&加法&操作,可以对任意类型进行计算。简而言之:没有这样的语法。不过我们可以使用Expression来做到这一点。
简单起见,我使用var关键字来代替显式变量类型,我们现在将要观察如何简单地缓存可重用的委托对象:
public static class Operator&T&
private static readonly Func&T, T, T&
public static T Add(T x, T y)
return add(x, y);
static Operator()
var x = Expression.Parameter(typeof(T), &x&);
var y = Expression.Parameter(typeof(T), &y&);
var body = Expression.Add(x, y);
add = Expression.Lambda&Func&T, T, T&&(
body, x, y).Compile();
因为我们在静态构造函数中编译委托对象,这样的操作只会为每个不同的类型T执行一次,接着便可重用了&&所以对于任何代码我们现在都可以直接使用 Operator&T&。有趣的是,这个简单的&Add&方法隐藏了许多复杂性:值类型或引用类型、基础操作(直接有IL指令与之对应)、隐 藏操作符(方法为类型定义的一部分)以及提升操作(用于自动处理Nullable&T&)等等。
这个做法甚至支持用户自定义类型&&只要你为它定义了+运算符。如果没有合适的运算符,这段代码便会抛出异常。在实际使用过程中这不太会是个问题,如果你不放心的话,可以在Add外加上try语句进行保护。
类库提供了完整的通用操作符实现。
Expression支持哪些东西?
在.NET 3.5中,Expression支持完整的用于查询或创建对象的操作符。
算术运算:Add, AddChecked, Divide, Modulo, Multiply, MultiplyChecked, Negate, NegateChecked, Power, Subtract, SubtractChecked, UnaryPlus
对象创建:Bind, ElementInit, ListBind, ListInit, MemberBind, MemberInit, New, NewArrayBounds, NewArrayInit
二进制运算:And, ExclusiveOr, LeftShift (&&), Not, Or, RightShift (&&)
逻辑运算:AndAlso (&&), Condition (? :), Equal, GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual, NotEqual, OrElse (||), TypeIs
成员访问:ArrayIndex, ArrayLength, Call, Field, Property, PropertyOrField
其他:Convert, ConvertChecked, Coalesce (??), Constant, Invoke, Lambda, Parameter, TypeAs, Quote
例如,我们可以用设置公开属性的方式实现浅克隆&&最简单的做法可以这样写:
person =& new Person
Name = person.Name,
DateOfBirth = person.DateOfBirth, ...
对于这种情况,我们需要使用MemberInit方法:
private static readonly Func&T, T& shallowC
static Operator()
var orig = Expression.Parameter(typeof(T), &orig&);
// for each read/write property on T, create a
// new binding (for the object initializer) that
// copies the original's value into the new object
var setProps = from prop in typeof(T).GetProperties (
BindingFlags.Public | BindingFlags.Instance)
where prop.CanRead && prop.CanWrite
select (MemberBinding) Expression.Bind(
prop, Expression.Property(orig, prop));
var body = Expression.MemberInit( // object initializer
Expression.New(typeof(T)), // ctor
setProps // property assignments
shallowClone = Expression.Lambda&Func&T, T&&(
body, orig).Compile();
这种做法比标准的反射方式的性能要高的多,而且不需要为每种类型维护一段代码,也不会遗漏一些新增的属性。
类似的方法还可以用于其他一些方面,如在DTO对象之间映射数据,在类型与DataTable对象之间建立关系&&或比较两个对象是否相等:
(x,y) =& x.Name == y.Name &&
x.DateOfBirth == y.DateOfBirth && ...;
在这里我们需要使用AndAlso来结合每个操作:
private static readonly Func&T, T, bool& propertiesE
static Operator()
var x = Expression.Parameter(typeof(T), &x&);
var y = Expression.Parameter(typeof(T), &y&);
var readableProps =
from prop in typeof(T).GetProperties(
BindingFlags.Public | BindingFlags.Instance)
where prop.CanRead
Expression combination = null;
foreach (var prop in readableProps)
var thisPropEqual = Expression.Equal(
Expression.Property(x, prop),
Expression.Property(y, prop));
if (combination == null)
{ // first
combination = thisPropE
{ // combine via &&
combination = Expression.AndAlso(
combination, thisPropEqual);
if (combination == null)
{ // return true
propertiesEqual = delegate { return true; };
propertiesEqual = Expression.Lambda&Func&T, T, bool&&(
combination, x, y).Compile();
Expression的限制&&及展望
到目前为止,Expression的表现几近完美&&然而,还有LINQ表达式的构造方式还有许多明显的限制:
没有内置的机制可以改变对象的属性/字段。
没有方法可以执行一系列的操作
在上面的例子中,我们可以使用AndAlso将多个步骤连接成一个逻辑语句。然而,在.NET 3.5中无法使用一个表达式树来表现如下的语句:
person.DateOfBirth = newD
person.Name = newN
person.UpdateFriends();
person.Save();
我们之前看到的Bind操作只能在创建新对象时使用。我们可以获取setter方法,但是我们无法将多个方法调用串联起来(就像&流畅&API那样,可惜目前没有)。
幸运的是,.NET 4.0扩展了Expression API,增加了新的类型和方法。这么做的目的是支持动态语言运行时(DLR,Dynamic Language Runtime)。这大大扩展了:
修改操作:AddAssign, AddAssignChecked, AndAssign, Assign, DivideAssign, ExclusiveOrAssign, LeftShiftAssign, ModuloAssign, MultiplyAssign, MultiplyAssignChecked, OrAssign, PostDecrementAssign, PostIncrementAssign, PowerAssign, PreDecrementAssign, PreIncrementAssign, RightShiftAssign, SubtractAssign, SubtractAssignChecked
算术操作:Decrement, Default, Increment, OnesComplement
成员访问:ArrayAccess, Dynamic
逻辑运算:ReferenceEqual, ReferenceNotEqual, TypeEqual
逻辑流:Block, Break, Continue, Empty, Goto, IfThen, IfThenElse, IfFalse, IfTrue, Label, Loop, Return, Switch, SwitchCase, Unbox, Variable
异常操作:Catch, Rethrow, Throw
调试:ClearDebugInfo, DebugInfo
这对编写动态代码来说可谓是个天大的好消息(它甚至包含了将代码编译为MethodBuilder的能力,可生成动态类型)。例如,我们可以用它来编写一个简单的for循环来打印数字0到9:
var exitFor = Expression.Label(&exitFor&); // jump label
var x = Expression.Variable(typeof(int), &x&);
var body = Expression.Block(new[] { x }, // declare scope variables
Expression.Assign(x,
Expression.Constant(0, typeof(int))), // init
Expression.Loop(
Expression.IfThenElse(
Expression.GreaterThanOrEqual( // test for exit
Expression.Constant(10, typeof(int))
Expression.Break(exitFor), // perform exit
Expression.Block( // perform code
Expression.Call(
typeof(Console), &WriteLine&, null, x),
Expression.PostIncrementAssign(x)
), exitFor));
var runtimeLoop = Expression.Lambda&Action&(body).Compile();
虽然看上去似乎不是那么一鸣惊人,但如果您要在运行时编写编译好的代码,它比其他方式要方便和灵活得多。
之前我们通过属性复制来克隆一个对象&&不过现在我们已经有能力把一个对象的数据复制给另一个对象了,这点对于ORM工具来说非常有用,例如跟踪一个对象的状态,执行外部更新,再提交这些改变。我们可以这么做:
var source = Expression.Parameter(typeof(T), &source&);
var dest = Expression.Parameter(typeof(T), &dest&);
// for each read/write property, copy the source's value
// into the destination object
var body = Expression.Block(
from prop in typeof(T).GetProperties(
BindingFlags.Public | BindingFlags.Instance)
where prop.CanRead && prop.CanWrite
select Expression.Assign(
Expression.Property(dest, prop),
Expression.Property(source, prop)));
var copyMethod = Expression.Lambda&Action&T,T&&(
body, source, dest).Compile();
使用表达式在运行时创建类型
.NET 4.0中有个有趣的功能:在此之前我们可以把一个Expression编译为一个独立的委托,而如今你可以在动态创建新类型时,使用 CompileToMethod方法将一个表达式树作为方法体提供给一个MethodBuilder对象。这意味着,在未来我们可以方便地编写功能丰富的 类型(包括多态和接口实现),而不用直接接触IL。
语言中的高级表达式
尽管运行时已经支持非常成熟的表达式树了,但是在C# 4.0中并没有额外的语言支持&&所以我们只能手动创建表达式。这一般不会成为问题,因为几乎没有LINQ提供者会支持这些复杂表达方式。如果你在编译期 知道这些类型,不如直接编写普通的方法或匿名方法。不过这也为4.0以后的版本留下了想象空间。例如(只是推测),想象一下如果语言可以使用 Expression.Assign和Expression.Block为数据库构造一个表达式树,就好比:
// this doesn&t work
myDatabase.Customers
.Where(c =& c.Region == &North&)
.Update(c =& {
c.Manager = &Fred&;
c.Priority = c.Priority + 10;
再次强调这只是&假如&&&这需要在LINQ提供者上耗费大量的工作,但是我们从中可以看出:理论上说,一个Expression对象是有能力来封装我们的意图的(更新实体的多个属性)。可惜,无论是语言还是框架都还有很长的路要走,只有时间可以说明一切。
阅读英文原文:。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至。也欢迎大家加入到中与我们的编辑和其他读者朋友交流。
Author Contacted
告诉我们您的想法
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
好像reflector不支持linq啊...
Re: 好像reflector不支持linq啊...
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
赞助商链接
InfoQ每周精要
订阅InfoQ每周精要,加入拥有25万多名资深开发者的庞大技术社区。
架构 & 设计
文化 & 方法
<及所有内容,版权所有 &#169;
C4Media Inc.
服务器由 提供, 我们最信赖的ISP伙伴。
北京创新网媒广告有限公司
京ICP备号-7
找回密码....
InfoQ账号使用的E-mail
关注你最喜爱的话题和作者
快速浏览网站内你所感兴趣话题的精选内容。
内容自由定制
选择想要阅读的主题和喜爱的作者定制自己的新闻源。
设置通知机制以获取内容更新对您而言是否重要
注意:如果要修改您的邮箱,我们将会发送确认邮件到您原来的邮箱。
使用现有的公司名称
修改公司名称为:
公司性质:
使用现有的公司性质
修改公司性质为:
使用现有的公司规模
修改公司规模为:
使用现在的国家
使用现在的省份
Subscribe to our newsletter?
Subscribe to our industry email notices?
我们发现您在使用ad blocker。
我们理解您使用ad blocker的初衷,但为了保证InfoQ能够继续以免费方式为您服务,我们需要您的支持。InfoQ绝不会在未经您许可的情况下将您的数据提供给第三方。我们仅将其用于向读者发送相关广告内容。请您将InfoQ添加至白名单,感谢您的理解与支持。

我要回帖

更多关于 jsp如何使用el表达式 的文章

 

随机推荐