作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用协议(protocol)来创建工程编号类型(“knumber”),所以我可以说 (+ "1k" "2Meg")
得到类似 "2.001Meg"
的东西.我应该能够像这样 (:val my-knumber)
那样从 knumber 中获取浮点值,但通常打印机应该显示字符串,也可以像这样访问 (:string my-knumber)
.这个数字将支持所有常用的p、n、u、m、k、Meg、G后缀,并在其中根据需要进行转换,如(/ "1Meg" "1G") -> "1m")
.我希望能够将它传递给任何需要数字的函数。
无论如何,有人可以为此提出一个策略吗?我想我需要使用协议(protocol)。我目前有一个 (defrecord knumber [val string])
但我不确定接下来会发生什么。
clojure 数字满足哪些协议(protocol)?我想我需要为此扩展一些现有的协议(protocol)/接口(interface)。
谢谢
最佳答案
我认为您的策略应该如下:
KNumber
就像 (defrecord knumber [value unit-map])
unit-map
单位到整数指数的映射(如果这些是工程数字,你会想要像 m/s^2 这样的单位,对吧?)。它可能看起来像 {"m" 1 "s" -2}
, KNumber
实现java.lang.Number
这样您就可以将它与 Clojure 中已经存在的其他数学函数一起使用。您需要实现 doubleValue
, longValue
等NumberWithUnits
您可以扩展到 KNumber
s 和正常的clojure 数字。至少它应该有方法(numeric-value [number])
和 (get-units [number])
+
, *
, -
等在您自己的命名空间中,对任何实现 NumberWithUnits
的东西进行操作协议(protocol)并返回 KNumber
. 关于clojure - 如何在 Clojure 中扩展数值协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11811271/
我是一名优秀的程序员,十分优秀!