在 DAML 合约中,如何从 Party 字段中提取当事方的名称?
目前,toText p
给我Party(Alice)
. 我只想保留党的名字。
您关心结果字符串的精确格式表明您正在用 DAML 实现编解码器。作为一般原则,DAML 擅长作为一种建模/合同语言,但因此具有有限的功能来支持这个问题所暗示的面向 IO 的工作。您通常最好返回 DAML 值,并在 Java/Scala/C#/Haskell/etc 中通过 Ledger API 与 DAML 接口实现编解码器。
不过,一旦你有了一个Text
值,你也可以通过 访问标准List
操作函数unpack
,所以转换"Party(Alice)"
为"Alice"
不是太困难:
daml 1.0 module PartyExtract where
import Base.List
def pack (cs: List Char) : Text =
foldl (fun (acc: Text) (c: Char) -> acc <> singleton c) "" cs;
def partyToText (p: Party): Text =
pack $ reverse $ drop 2 $ reverse $ drop 7 $ unpack $ toText p
test foo : Scenario {} = scenario
let p = 'Alice'
assert $ "Alice" == partyToText p
在 DAML 1.2 中扩展了标准库,因此可以简化上面的代码:
daml 1.2
module PartyExtract2
where
import DA.Text
traceDebug : (Show a, Show b) => b -> a -> a
traceDebug b a = trace (show b <> show a) $ a
partyToText : Party -> Text
partyToText p = dropPrefix "'" $ dropSuffix "'" $ traceDebug "show party: " $ show p
foo : Scenario ()
foo = do
p <- getParty "Alice"
assert $ "Alice" == (traceDebug "partyToText party: " $ partyToText p)
注意:我保留了定义和调用,traceDebug
以便您可以看到在场景跟踪输出中生成的确切字符串。