【问题标题】:Return value of a variadic logging probe可变参数记录探针的返回值
【发布时间】:2015-08-18 06:19:52
【问题描述】:

我希望这个函数准确地返回它所传递的内容(作为参数传入):

(defn log [& txts]
  (.log js/console (apply str txts))
  txts)

由于txts被返回的那一刻,这与传入的调用者不完全相同。

一旦这个问题得到解答,我将拥有一个能够用作探针的日志记录函数——能够在不改变程序所做的任何事情的情况下包裹任何现有的函数调用。

这是一个 REPL 友好(复制和粘贴,日志函数已更改为适用于 Clojure)示例,它显示日志记录会影响输出:

(def infos [{:colour [0,0,139]} {:colour [255,255,0]} {:colour [0,0,0]} {:colour [255,0,0]}])

(defn log [& txts]
  (println (apply str txts))
  txts)

(defn random-colour-logged
  []
  (let [colour-idx (rand-int 4)]
    (log (:colour (get infos colour-idx)))))

(defn random-colour-not-logged
  []
  (let [colour-idx (rand-int 4)]
    (:colour (get infos colour-idx))))

(random-colour-logged)
(random-colour-logged)
(random-colour-not-logged)
(random-colour-not-logged)  

这是我刚刚收到的输出:

user=> (random-colour-logged)
[255 255 0]
([255 255 0])
user=> (random-colour-logged)
[0 0 139]
([0 0 139])
user=> (random-colour-not-logged)
[255 255 0]
user=> (random-colour-not-logged)
[255 0 0]

【问题讨论】:

  • 您能否添加一个示例 - 您所说的“不完全相同”是什么意思?此函数应返回您传入的参数列表。

标签: clojure clojurescript


【解决方案1】:

当你定义你的函数为

(defn log [& txts]
  ...
  txts)

这意味着您可以传递任意数量的参数,然后将这些参数收集在一个列表 txt 中。因此,您的情况下的返回值是一个列表。

所以当你打电话时

(random-colour-logged)

txts 的值将是单个向量的列表:

'([255 255 0])

这发生在您的示例中(在您的函数内部):

user=> (println (apply str '([255 255 0])))
[255 255 0]

尝试将您的功能更改为

(defn log [txt]
  (.log js/console txt)
  txt)

它应该可以正常工作。

编辑: 您还可以更改调用日志函数的方式:

(defn random-colour-logged
  []
  (let [colour-idx (rand-int 4)]
    (apply log (:colour (get infos colour-idx)))))

这样 - 你记录的内容和函数返回的内容都是相同的 - 数字列表。

【讨论】:

  • (def big-word "varadic")(log "但以后就不再是" big-word)
  • 查看我的编辑。如果您不想为您的案例实施自定义日志记录,那么您无能为力。
  • 有比在日志调用之前输入apply 更简单的解决方法。即便如此,我还是复制/粘贴了您的 random-colour-logged - 在 REPL 中,您仍然会看到“记录”和“未记录”调用的不同结果。
  • 我要使用的实际解决方法是拥有一个名为wrap 的函数,它是log 的非可变版本。我会让log 不返回任何东西。
猜你喜欢
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 2013-03-20
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
相关资源
最近更新 更多