Data structures Clojure-如何声明记录的集合或向量
如何定义记录集合或记录向量 我有以下代码片段:Data structures Clojure-如何声明记录的集合或向量,data-structures,clojure,record,Data Structures,Clojure,Record,如何定义记录集合或记录向量 我有以下代码片段: (记录交易[a、b、c]) 我想定义一个名为LastTransactions的事务集合来实现如下功能: (defn can-authorize "Validate Authorization by Transaction" [^Transaction transaction, ^LastTransactions lastTransactions] (... business logic) ) 第一个问题,这样做对吗
(记录交易[a、b、c])
我想定义一个名为LastTransactions的事务集合来实现如下功能:
(defn can-authorize
"Validate Authorization by Transaction"
[^Transaction transaction, ^LastTransactions lastTransactions]
(... business logic)
)
第一个问题,这样做对吗
其次,如何声明该结构?Clojure的类型提示不提供任何类型验证—您可以使用or进行验证。它们仅用于编译器在参数上调用Java方法时防止反射。为此,您不需要键入提示向量,因为Clojure的核心函数用于集合(
first
,conj
,等等)的设计不需要对标准集合进行反射
但是,如果需要,可以键入从lastTransaction
序列中提取的元素,例如:
(defn can-authorize
"Validate Authorization by Transaction"
[^Transaction transaction, lastTransactions]
...
(for [^Transaction t lastTransactions]
(...do-something-with t))
Clojure的类型提示不提供任何类型验证—您可以使用或进行验证。它们仅用于编译器在参数上调用Java方法时防止反射。为此,您不需要键入提示向量,因为Clojure的核心函数用于集合(
first
,conj
,等等)的设计不需要对标准集合进行反射
但是,如果需要,可以键入从lastTransaction
序列中提取的元素,例如:
(defn can-authorize
"Validate Authorization by Transaction"
[^Transaction transaction, lastTransactions]
...
(for [^Transaction t lastTransactions]
(...do-something-with t))
类型提示用于避免反射。它们不用于静态类型化函数或构造函数参数 只需使用basic
^java.util.List
类型提示,而不是^LastTransactions
。在这种情况下,在函数体中使用错误的lastTransactions
,将导致ClassCastException
失败。但是,它不会检查该列表中元素的类型。为此,每次使用lastTransactions
的元素时,都要使用类型提示
带有类型提示的示例1:
(defn can-authorize
[^Transaction transaction, ^java.util.List lastTransactions]
(.size lastTransactions)
)
(defn can-authorize [^String transaction, lastTransactions]
(.size lastTransactions))
在本例中,反编译的java代码如下所示:
// Decompiling class: user$can_authorize
import clojure.lang.*;
import java.util.*;
public final class user$can_authorize extends AFunction
{
public static Object invokeStatic(final Object transaction, Object lastTransactions) {
final Object o = lastTransactions;
lastTransactions = null;
return ((List)o).size();
}
public Object invoke(final Object transaction, final Object lastTransactions) {
return invokeStatic(transaction, lastTransactions);
}
}
没有类型提示的示例2:
(defn can-authorize
[^Transaction transaction, ^java.util.List lastTransactions]
(.size lastTransactions)
)
(defn can-authorize [^String transaction, lastTransactions]
(.size lastTransactions))
反编译到:
// Decompiling class: user$can_authorize
import clojure.lang.*;
public final class user$can_authorize extends AFunction
{
public static Object invokeStatic(final Object transaction, Object lastTransactions) {
final Object target = lastTransactions;
lastTransactions = null;
return Reflector.invokeNoArgInstanceMember(target, "size", false);
}
public Object invoke(final Object transaction, final Object lastTransactions) {
return invokeStatic(transaction, lastTransactions);
}
}
比较结果返回语句:
带有类型提示
return ((List)o).size();
return Reflector.invokeNoArgInstanceMember(target, "size", false);
无类型提示
return ((List)o).size();
return Reflector.invokeNoArgInstanceMember(target, "size", false);
PS:使用类型提示反编译的代码用于避免反射。它们不用于静态类型化函数或构造函数参数 只需使用basic
^java.util.List
类型提示,而不是^LastTransactions
。在这种情况下,在函数体中使用错误的lastTransactions
,将导致ClassCastException
失败。但是,它不会检查该列表中元素的类型。为此,每次使用lastTransactions
的元素时,都要使用类型提示
带有类型提示的示例1:
(defn can-authorize
[^Transaction transaction, ^java.util.List lastTransactions]
(.size lastTransactions)
)
(defn can-authorize [^String transaction, lastTransactions]
(.size lastTransactions))
在本例中,反编译的java代码如下所示:
// Decompiling class: user$can_authorize
import clojure.lang.*;
import java.util.*;
public final class user$can_authorize extends AFunction
{
public static Object invokeStatic(final Object transaction, Object lastTransactions) {
final Object o = lastTransactions;
lastTransactions = null;
return ((List)o).size();
}
public Object invoke(final Object transaction, final Object lastTransactions) {
return invokeStatic(transaction, lastTransactions);
}
}
没有类型提示的示例2:
(defn can-authorize
[^Transaction transaction, ^java.util.List lastTransactions]
(.size lastTransactions)
)
(defn can-authorize [^String transaction, lastTransactions]
(.size lastTransactions))
反编译到:
// Decompiling class: user$can_authorize
import clojure.lang.*;
public final class user$can_authorize extends AFunction
{
public static Object invokeStatic(final Object transaction, Object lastTransactions) {
final Object target = lastTransactions;
lastTransactions = null;
return Reflector.invokeNoArgInstanceMember(target, "size", false);
}
public Object invoke(final Object transaction, final Object lastTransactions) {
return invokeStatic(transaction, lastTransactions);
}
}
比较结果返回语句:
带有类型提示
return ((List)o).size();
return Reflector.invokeNoArgInstanceMember(target, "size", false);
无类型提示
return ((List)o).size();
return Reflector.invokeNoArgInstanceMember(target, "size", false);
PS:使用反编译的代码“声明”结构是什么意思?Clojure没有静态类型系统,因此只需确保将向量作为第二个参数传递给
即可授权。如果要检查向量是否在运行时实际提供,可以为函数定义规范或约定。它不应该是^LastTransactions LastTransactions
而不是^LastTransactions LastTransactions
?而且你可能不想要唱片。事实上,我不确定他们的目的是什么——你可以用一张地图。那么第二个参数将是一个映射向量。@ChrisMurphyFixed@Lee谢谢你的解释。你说的“声明”结构是什么意思?Clojure没有静态类型系统,因此只需确保将向量作为第二个参数传递给即可授权。如果要检查向量是否在运行时实际提供,可以为函数定义规范或约定。它不应该是^LastTransactions LastTransactions
而不是^LastTransactions LastTransactions
?而且你可能不想要唱片。事实上,我不确定他们的目的是什么——你可以用一张地图。那么第二个参数将是一个映射向量。@ChrisMurphyFixed@Lee谢谢你的解释,我会的。非常感谢。我是Clojure的初学者,正在学习它的行为方式Clojure规范和Plumatic模式之间的主要区别是什么?我会这样做的。非常感谢。我是Clojure的初学者,正在学习它的行为方式Clojure规范和Plumatic模式之间的主要区别是什么?