ejs 遍历更多嵌套对象
为NULL还是不为NULL? 编程语言设计人员不可避免地必须决定他们是否支持NULL。 而且事实证明,他们很难做到这一点。 NULL在任何语言中都不是直观的,因为NULL是该语言的公理,而不是可以从较低级公理派生的规则。 以Java为例,其中:
// This yields true:
null == null
// These throw an exception (or cannot be compiled)
null.toString();
int value = (Integer) null;
好像没有其他选择。 例如,SQL实现了一种更具表现力但可能不太直观的三值逻辑 ,大多数开发人员有时都会以微妙的方式犯错。
同时,SQL不知道“ NULL”结果,只有“ NULL”列值。 从集合论的角度来看,只有空集合 ,没有NULL集。
其他语言允许通过特殊运算符取消对null的引用,从而使编译器在后台为您生成乏味的null检查。 Groovy的一个例子就是它的null安全解引用运算符 。 正如在有关Scala等效项的讨论中可以看到的那样,该解决方案远没有被普遍接受。 Scala使用Option ,Java 8将使用Optional (或@Nullable )来模仿。
让我们考虑一个更广泛的解决方案
对我来说,可空性不是一等公民。 我个人不喜欢这样的事实,即Scala的Option [T]类型通过引入通用包装器类型(即使它似乎通过可穿越的trait实现了类似的数组功能)也污染了我的类型系统。 我不想区分Option [T]和T的类型。当从反射API角度进行类型推理时,尤其如此,Scala(和Java)的传统将永远阻止我在运行时访问T的类型。 。
但是,更糟糕的是,在大多数情况下,在我的应用程序中,我实际上并不想区分“选项”引用和“某些”引用。 哎呀,我什至不想在拥有1个参考和数十个参考之间进行区分。 jQuery非常正确。 jQuery之所以如此流行的主要原因之一是,因为您所做的一切,都是对一组包装的DOM元素进行的。 API从不区分匹配1或100 div。 查看以下代码:
// This clearly operates on a single object or none
$('div#unique-id').html('new content')
.click(function() { ... });
// This possibly operates on several objects or none
$('div.any-class').html('new content')
.click(function() { ... });
这是可能的,因为JavaScript允许您覆盖JavaScript数组类型的原型,至少在jQuery库的范围内,通常对数组进行修改。 它能变得更棒吗? .html()和.click()是整个数组上执行的操作,无论匹配中的元素是零,一还是100。 在一切都像数组(或ArrayList)的情况下,一种更类型安全的语言会是什么样? 考虑以下模型:
class Customer {
String firstNames; // Read as String[] firstNames
String lastName; // Read as String[] lastName
Order orders; // Read as Order[] orders
}
class Order {
int value; // Read as int[] value
boolean shipped() { // Read as boolean[] shipped
}
}
不要大声说(只是)。 假设这不会导致内存或计算开销。 让我们继续考虑它的优点。 因此,我想查看客户的订单是否已发货。 简单:
Customer customer = // ...
boolean shipped = customer.orders.shipped();
看起来还不算壮观(尚未)。 但是请注意一个客户可以有多个订单的事实,上面的检查实际上是要查看是否所有订单都已发货。 我真的不想编写循环,我发现很明显我想对每个订单执行出厂()检查。 考虑:
// The length pseudo-field would still be
// present on orders
customer.orders.length;
// In fact, the length pseudo-field is also
// present on customer, in case there are several
customer.length;
// Let's add an order to the customer:
customer.orders.add(new Order());
// Let's reset order
customer.orders.clear();
// Let's calculate the sum of all values
// OO-style:
customer.orders.value.sum();
// Functional style:
sum(customer.orders.value);
当然会有一些警告,上面选择的方法名称可能不是最好的方法。 但是,能够以相同的语法方式处理单个引用(可为空或不可为空)或数组引用(空,单值,多值)只是纯粹的语法上的麻烦。 空检查将由长度检查代替,但是大多数情况下,您甚至不必执行这些检查,因为在数组中的每个元素上始终会调用每种方法。 当前的单引用和多引用语义将通过命名约定来记录。 显然,命名为“ orders”表示可以使用多重引用,而命名为“ customer”的客户则表示不可能使用多重引用。
正如用户所评论的那样,该技术通常称为数组编程 ,是在Matlab或R中实现的。
说服了吗
我很好奇您的想法!
ejs 遍历更多嵌套对象