การมีปัญหาในการแก้ไข clojure.string/replace ไม่ใช่ข้อผิดพลาดของฟังก์ชัน

นี่คือบล็อกโค้ดดั้งเดิมสำหรับฟังก์ชันสตริง "แทนที่" ของ ClojureScript:

(defn replace
  "Replaces all instance of match with replacement in s.
  match/replacement can be:
  string / string
  pattern / (string or function of match)."
 [s match replacement]
 (cond
   (string? match)
   (.replace s (js/RegExp. (gstring/regExpEscape match) "g") replacement)

   (instance? js/RegExp match)
   (if (string? replacement)
     (replace-all s match replacement)
     (replace-all s match (replace-with replacement)))

   :else (throw (str "Invalid match arg: " match))))

ดังที่คุณเห็นในบรรทัดนี้:[s match replacement] วิธีนี้ยอมรับสามอาร์กิวเมนต์

จาก REPL ของฉัน:

user=> (replace ":c41120" ":" "")

ArityException Wrong number of args (3) passed to: core/replace  clojure.lang.AFn.throwArity (AFn.java:429)

ฉันเป็นคนเดียวที่คิดว่าฉันผ่านการโต้แย้งตามจำนวนที่ถูกต้อง (3) หรือไม่? มีความคิดใดบ้างว่าทำไมสิ่งนี้ถึงล้มเหลว?

คำถาม ตอนที่ 2: เจาะจง

ในไฟล์ส่วนประกอบ cljs ของฉัน ฉันมี 'ข้อกำหนด' เหล่านี้:

(ns labrador.components
(:require [re-frame.core :as rf]
          [reagent.core :refer [atom]]
          [clojure.string :as s]
          [labrador.helpers :as h]))

ฉันประสบความสำเร็จในการใช้ "s/join" และ "s/blank?" ในไฟล์นี้ แต่เมื่อฉันลองใช้ "s/replace" เหมือนด้านล่าง (โปรดทราบว่าการโทร "replace" อยู่ในสาย 484):

            (for [roll-count order-item-roll-counts]
              (let [key (key roll-count)
                    val (val roll-count)
                    code (s/replace key ":" "")]

...ฉันได้รับข้อผิดพลาดต่อไปนี้:

Uncaught TypeError: s.replace is not a function
  at clojure$string$replace (string.cljs?rel=1489020198332:48)
  at components.cljs?rel=1489505254528:484

...และเมื่อฉันเรียกใช้ฟังก์ชันการแทนที่อย่างชัดเจน เช่น:

code (clojure.string/replace key ":" "")]

...ฉันยังคงได้รับข้อผิดพลาดเดิมทุกประการ ราวกับว่าฉันยังคงโทรหา "s/replace"

ฉันยังใหม่กับ Clojure/ClojureScript เลยเปลือยเปล่าด้วยความไม่รู้ที่ชัดเจนของฉัน


person digijim    schedule 13.03.2017    source แหล่งที่มา


คำตอบ (3)


ประการแรก ดูเหมือนว่าคุณกำลังใช้งาน Clojure REPL ไม่ใช่ ClojureScript อย่างที่สอง คุณกำลังโทรหา clojure.core/replace แทนที่จะเป็น clojure.string/replace

person Daniel Compton    schedule 14.03.2017
comment
ใช่ clojure.string/replace ใช้งานได้กับ REPL ของฉัน และฉันใช้มันใน ClojureScript สำเร็จแล้ว ขอขอบคุณที่ชี้แจงความแตกต่างนั้น แต่ฉันได้รับข้อผิดพลาดเมื่อฉันลองใช้ฟังก์ชันการแทนที่อันใดอันหนึ่งนี้ ฉันจะอัปเดตคำถามของฉันพร้อมรายละเอียดเพิ่มเติม - person digijim; 14.03.2017

ฉันพบข้อผิดพลาด ฉันกำลังพยายามแทนที่คีย์ ไม่ใช่สตริง เมื่อฉันแปลงคีย์เป็นสตริงก่อนที่จะเรียกใช้ฟังก์ชันการแทนที่ โดยการเปลี่ยน (s/replace key ":" "") ด้วย (s/replace (str key) ":" "") ทุกอย่างเป็นไปด้วยดี

ฉันถูกโยนออกนอกหลักสูตรด้วยข้อความแสดงข้อผิดพลาดที่ไม่ชัดเจน การถูกบอกว่าฟังก์ชัน 'แทนที่' ไม่ใช่ฟังก์ชันเมื่อมันชัดเจน แทนที่จะบอกว่าฟังก์ชันไม่สามารถทำงานได้เพราะข้อมูลที่ส่งไม่ใช่สตริง แค่ทำให้ฉันเสียเวลาในการพัฒนาประมาณสามชั่วโมง

person digijim    schedule 14.03.2017
comment
หากคุณกำลังพยายามรับสตริงจากคำหลักที่ไม่มีนำหน้า : คุณสามารถใช้ฟังก์ชัน name ได้ - person Daniel Compton; 15.03.2017
comment
เพื่อชี้แจงให้กระจ่างยิ่งขึ้น ข้อผิดพลาดไม่ได้ระบุว่า clojure.string/replace ไม่ใช่ฟังก์ชัน แต่เป็นผลมาจากการเรียก (.replace s ...) ที่ล้มเหลวในการใช้งาน เปรียบเทียบ (let [s ":abc"] (.replace s ":" "")) กับ (let [s :abc] (.replace s ":" "")) ส่วนหลังทำให้เกิดข้อผิดพลาดและบ่งชี้ว่าไม่มีฟังก์ชัน replace ที่กำหนดไว้ในคำหลัก - person Mike Fikes; 18.01.2018

ฉันพบปัญหานี้เมื่อ args แรกเป็นตัวเลข ไม่ใช่สตริง

ฉันคิดว่าข้อความแสดงข้อผิดพลาดเป็นสิ่งที่ทำให้เข้าใจผิด

person Jiacai Liu    schedule 08.01.2018
comment
ขอบคุณ! แก้ไขกรณีของฉัน - person KgOfHedgehogs; 14.11.2018