วิธีส่งแผนที่ให้ทำงานด้วยอาร์กิวเมนต์ของคำหลัก [ซ้ำกัน]

ฉันมีฟังก์ชั่นเช่นนี้:

pdfkit-clj.core/gen-pdf
 [html & {:keys [path tmp asset-path stylesheets margin orientation page-size], :or {path (:path defaults), tmp (:tmp defaults), asset-path (:asset-path defaults), margin {}, orientation (:orientation defaults), page-size (:page-size defaults)}}]

ตอนนี้ฉันกำลังพยายามส่งแผนที่พร้อมอาร์กิวเมนต์ของคำหลักซึ่งใช้ไม่ได้ผล

(let [gen_pdf_args {:tmp tmp_dir
                     :margin {:top 0 :right 0 :bottom 0 :left 0}}] 
        (gen-pdf html-black gen_pdf_args)
)

ปัญหานี้คล้ายกับการเปลี่ยนรายการให้เป็นข้อโต้แย้ง


person m33lky    schedule 16.05.2017    source แหล่งที่มา
comment
คำถามเชื่อมโยงข้อแรกมีแนวทางที่แตกต่างกันสามวิธีในการแก้ปัญหา ฉันเห็นด้วยกับคำตอบยอดนิยมว่าวิธีที่ดีที่สุดคือหลีกเลี่ยงสถานการณ์นี้โดยไม่เขียนฟังก์ชันเพื่อรับ args ของคำหลักที่ไม่ได้ม้วน แต่ถ้าคุณไม่สามารถเปลี่ยนอินเทอร์เฟซของฟังก์ชันได้ ฉันคิดว่าคำถามที่เชื่อมโยงที่สองมีคำตอบที่ดีที่สุดสำหรับวิธีการ เพื่อแก้ไขปัญหา   -  person amalloy    schedule 16.05.2017


คำตอบ (2)


การใช้ & {:keys [...]} ไม่ได้หมายความว่าคุณจะเรียกมันด้วยแผนที่จริงๆ แต่คุณเรียกมันว่า (gen-pdf html :tmp tmp_dir :margin {:top 0}) แทน

หากคุณต้องการใช้แผนที่จริงๆ คุณสามารถใช้ Apply และ Flatten เช่น (apply gen-pdf html-black (-> gen_pdf_args vec flatten))

person Alejandro C.    schedule 16.05.2017
comment
ฉันเข้าใจ. ฉันกำลังสร้างข้อโต้แย้งโดยทางโปรแกรมหรือต้องการตั้งค่าข้อโต้แย้งในคราวเดียว - person m33lky; 16.05.2017
comment
ดูการแก้ไขของฉัน apply ควรแก้ปัญหาของคุณ - person Alejandro C.; 16.05.2017
comment
ใช่ ฉันควรใช้สิ่งที่มีน้ำหนักเบาแทนการพึ่งพา lib ภายนอก - person m33lky; 16.05.2017

ดูเหมือนว่าคุณต้องการบางสิ่งที่คล้ายกับฟังก์ชัน keyvals:

(keyvals m)
 "For any map m, returns the keys & values of m as a vector,
  suitable for reconstructing via (apply hash-map (keyvals m))."

(keyvals {:a 1 :b 2})
;=> [:b 2 :a 1]
(apply hash-map (keyvals {:a 1 :b 2}))
;=> {:b 2, :a 1}

โปรดสังเกตว่าคุณยังต้องใช้ apply เหมือนที่ Alejandro พูด คุณสามารถดูข้อมูลเพิ่มเติมได้ที่ keyvals ที่นี่

person Alan Thompson    schedule 16.05.2017
comment
ใช่แล้ว นี่เป็นสิ่งที่ดี เพียงจำไว้ว่า keyvals ไม่ได้เป็นส่วนหนึ่งของแกนกลาง - person Alejandro C.; 16.05.2017
comment
เพียงใช้ (apply concat xs) หรือ (mapcat seq xs) แทนที่จะนำเข้าไลบรารีขนาดใหญ่ทั้งหมดเพื่อใช้ (keyvals xs) - person amalloy; 16.05.2017