Проблемы с решением 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], этот метод принимает три аргумента.

Из моего РЕПЛ:

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

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

Я единственный, кто думает, что я передал правильное количество аргументов (3)? Любая идея, почему это терпит неудачу?

Вопрос, часть II: уточнение

В моем файле component.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

Я пришел к этой проблеме, когда первый аргумент - это число, а не строка.

Я думаю, что сообщение об ошибке вводит в заблуждение

person Jiacai Liu    schedule 08.01.2018
comment
Спасибо! Решил мой случай - person KgOfHedgehogs; 14.11.2018