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模式之间的主要区别是什么?