【问题标题】:How to access LazySeq values如何访问 LazySeq 值
【发布时间】:2016-08-03 05:36:40
【问题描述】:

我正在玩wit/duckling 库。它是用 clojure 编写的,我以前没有使用 clojure 的经验。通过遵循它的文档,我得到了一个变量的值作为

({:dim :time, :body "20 minutes from now", :value {:type "value", :value "2016-08-03T10:50:56.000+05:30", :grain :second, :values ({:type "value", :value "2016-08-03T10:50:56.000+05:30", :grain :second})}, :start 21, :end 40})

做了一些谷歌搜索后,我知道它是 clojure.lang.LazySeq 并且以冒号(:)开头的标记是关键字而不是键。我想访问 :values 关键字的值,我也阅读了 clojure 基础知识,但无法访问 :values 关键字的值。我希望必须有一种方法,以便通过编写 lazy_seq[:values],我得到它的价值。有人可以帮忙吗??

【问题讨论】:

    标签: clojure lazy-sequences


    【解决方案1】:

    试试这个:

    > (use 'clojure.pprint)
    
    > (def stuff '({:dim :time, :body "20 minutes from now", :value {:type "value", :value "2016-08-03T10:50:56.000+05:30", :grain :second, :values ({:type "value", :value "2016-08-03T10:50:56.000+05:30", :grain :second})}, :start 21, :end 40}))
    

    我们使用“pretty print”函数pprint 为数据结构获得嵌套良好的输出:

    > (pprint stuff)
    ({:dim :time,
      :body "20 minutes from now",
      :value
      {:type "value",
       :value "2016-08-03T10:50:56.000+05:30",
       :grain :second,
       :values
       ({:type "value",
         :value "2016-08-03T10:50:56.000+05:30",
         :grain :second})},
      :start 21,
      :end 40})
    

    所以我们有一个项目的列表,它是键的映射:dim:body:value:start 和:end。 :value 键的值是另一个键映射:type、:value、:grain、:values。

    所以,要取消嵌套,

    (pprint (first stuff))
    {:dim :time,
     :body "20 minutes from now",
     :value
     {:type "value",
      :value "2016-08-03T10:50:56.000+05:30",
      :grain :second,
      :values
      ({:type "value",
        :value "2016-08-03T10:50:56.000+05:30",
        :grain :second})},
     :start 21,
     :end 40}
    
    > (pprint (:value (first stuff)))
    {:type "value",
     :value "2016-08-03T10:50:56.000+05:30",
     :grain :second,
     :values
     ({:type "value",
       :value "2016-08-03T10:50:56.000+05:30",
       :grain :second})}
    
    > (pprint (:values (:value (first stuff))))
    ({:type "value",
      :value "2016-08-03T10:50:56.000+05:30",
      :grain :second})
    

    您也可以使用线程优先宏->,如下所示:

    > (pprint (-> stuff first :value :values))
    ({:type "value",
      :value "2016-08-03T10:50:56.000+05:30",
      :grain :second})
    

    这样原来的嵌套结构stuff流向函数first:value:values(按此顺序)。

    【讨论】:

    • 谢谢你艾伦这么好的解释。我接受了 Yuri 的回答 b/c,他让我介绍入门,这对我很有帮助。
    【解决方案2】:

    假设您的序列由s 表示:

    (get-in (first s) [:value :values])
    

    如果序列中可能有多个相同形状的元素,并且您想一次处理所有元素得到所有:values,那么

    (map #(get-in % [:value :values]) s)
    

    (你不需要关心懒惰。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 2023-03-28
      相关资源
      最近更新 更多