Enjoy表达式为空判断,能不能忽略双"??"

现在都要这样写:#(o.ename??)

如果不加??,就会报错,建议波总完善一下,不加"??"也能显示空字符串,像那种JS模板引擎,也是不需要加特别字符的。

像这样#(o.ename)比较清爽。

评论区

杜福忠

2022-04-18 17:31

是做添加功能的时候吧? 添加一般我会在后台放置一个 o 对象,这样前面就不用再?? 了。
或者在模板中取值前加一行判断:#set(o = (o == null) ? {} : o) ,这样后续也不用再?? 了,很方便

北流家园网

2022-04-19 10:18

@杜福忠 也可以,就是还要多加一句了

北流家园网

2022-04-19 10:19

l745230

2022-04-19 11:17

如果能像前端Es6那样 用#(o?.ename) 体验更好

北流家园网

2022-04-19 14:23

@l745230 不错呀,希望JF也能完善这样

zzutligang

2022-04-19 16:50

个人认为,加两个??,是为了防止o为null,这应该是最合适的解决方案。如果写成#(o?.ename) ,觉得更别扭了。如果把#()输出语句直接做null判断,是不符合编程习惯的。如果没有输出信息,到底是o=null了,还是o.ename为null了?

杜福忠

2022-04-19 17:19

@北流家园网 不会改这个规则的,现在的规则,估计大部分人觉得是合理的。而且已经开发了那么多项目,轻易改变规则,那会是灾难。。。自己用的话,Enjoy 也是开放的,可以自己DIY

JFinal

2022-04-19 21:07

@北流家园网 #(o.ename??) 在 o 不为 null 的时候,不需要??操作符,不会抛异常

a.b.c.d.e 这种表达式的最后一级允许 e 为null,但前面的几级不允许,但是多级可以只需要一个 ?? 操作符,例如:
a.b.c.d.e ??

原因之一是为了减少出开发者手误的概率,还有一些别的原因,有点不记得了,当时是有一些别的考虑,好像有性能的考虑,不太记得了

l745230

2022-04-20 08:34

@zzutligang @JFinal o?.ename 这种写法可以说是现代前端非常通用的写法了. 而 ??(空合并安全取值调用操作符) 不是JAVA中的用法,也不是JS中的用户, 增加了学习成本. o?.ename 还往JS方向靠拢. Vue/React 中?.是非常好用的写法了

zzutligang

2022-04-20 09:24

@l745230 就一个??符号,能增加多大的学习成本?更何况,无论如何,后台模板语法都不可能完全靠上JS语法的。

opal

2022-04-21 18:00

我是用 nvl(a,'def'),这样来处理,可读性好

crazycl

2022-04-25 09:23

两个问号,纠结啥呢?有这些时间,又写完一个模块,哈哈

JFinal

2022-05-03 12:51

最新版本已添加该功能,称之为 "可选链操作符",用法如下:
user?.name
user?.getName()?.length()
a?.b?.c()?.d?.e?.f

北流家园网

2022-05-04 07:38

波总太牛了

JFinal

2022-05-04 15:41

@北流家园网 enjoy 是极简设计,以及采用了独创的词法分析、语法分析算法。添加这个功能,总共也就 30 行代码的事

换成是其它模板引擎,动了操作符,可是不小的工作量,我在以前的博客中有过说明,传统模板引擎需要按下面的方式来做:
1: 修改语法、词法涉及的规则 .g4 描述文件
2: 运行 antlr 的生成器,重新生成 Parser、Lexer
3: 开始写自己的代码

但 enjoy 完全不需要,想深入研究的可以看我的博客:
https://my.oschina.net/jfinal/blog/3146036

杜福忠

2022-05-05 10:33

@杜福忠 看来我思维还是太僵化了,只有“替换”和“改变”思维,没想到“共存”模式。JFinal还是JFinal啊🐂🍺

热门反馈

扫码入社