在 DAML 合约中,如何从 Party 字段中提取当事方的名称?
目前,toText p
给我Party(Alice)
.我只想保留党的名字。
最佳答案
您关心结果字符串的精确格式表明您正在用 DAML 实现编解码器。作为一般原则,DAML 擅长作为一种建模/契约(Contract)语言,但因此具有有限的功能来支持这个问题所暗示的面向 IO 的工作。您通常最好返回 DAML 值,并在 Java/Scala/C#/Haskell/etc 中通过 Ledger API 与 DAML 接口(interface)实现编解码器。
不过,一旦您拥有 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
因此您可以在场景跟踪输出中看到正在生成的确切字符串。
关于daml - 如何提取党的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54133342/