cara meneruskan peta agar berfungsi dengan argumen kata kunci [duplikat]

Saya memiliki fungsi seperti ini:

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)}}]

Sekarang saya mencoba memberikan peta dengan argumen kata kunci yang tidak berfungsi.

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

Masalah ini mirip dengan mengubah daftar menjadi argumen.


person m33lky    schedule 16.05.2017    source sumber
comment
Pertanyaan terkait pertama memiliki tiga pendekatan berbeda untuk memecahkan masalah; Saya setuju dengan jawaban teratas bahwa pendekatan terbaik adalah menghindari situasi ini dengan tidak menulis fungsi untuk mengambil argumen kata kunci yang belum digulung, tetapi jika Anda tidak dapat mengubah antarmuka fungsi maka saya pikir pertanyaan tertaut kedua memiliki jawaban terbaik untuk caranya untuk mengatasi masalah tersebut.   -  person amalloy    schedule 16.05.2017


Jawaban (2)


Menggunakan & {:keys [...]} sebenarnya tidak mengharapkan Anda menyebutnya dengan peta. Sebaliknya, Anda menyebutnya seperti (gen-pdf html :tmp tmp_dir :margin {:top 0}).

Jika Anda benar-benar ingin menggunakan peta Anda, Anda dapat menggunakan apply dan flatten seperti (apply gen-pdf html-black (-> gen_pdf_args vec flatten)).

person Alejandro C.    schedule 16.05.2017
comment
Aku mengerti itu. Saya sedang menyusun argumen secara terprogram atau saya ingin menetapkan argumen sekaligus. - person m33lky; 16.05.2017
comment
Lihat hasil edit saya. apply seharusnya menyelesaikan masalah Anda. - person Alejandro C.; 16.05.2017
comment
Ya, saya harus menggunakan sesuatu yang ringan untuk ini daripada mengandalkan lib eksternal. - person m33lky; 16.05.2017

Sepertinya Anda menginginkan sesuatu yang mirip dengan fungsi 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}

Perhatikan bahwa Anda masih perlu menggunakan apply seperti kata Alejandro. Anda dapat menemukan informasi lebih lanjut di keyvals di sini.

person Alan Thompson    schedule 16.05.2017
comment
Ya, ini bagus; perlu diingat bahwa keyvals bukan bagian dari inti - person Alejandro C.; 16.05.2017
comment
Cukup gunakan (apply concat xs) atau (mapcat seq xs) daripada mengimpor seluruh perpustakaan besar untuk menggunakan (keyvals xs). - person amalloy; 16.05.2017