为什么相同的字符串在 Nim 中不相等?
Why same strings are not equal in Nim?
JSON包生成的字符串不等于相同的字符串,为什么?
下面代码中的最后一个相等性检查是错误的,为什么? playground
import strformat, json
type Price = tuple[price: float, currency: string]
func `%`*(v: Price): JsonNode = %(fmt"{v.price} {v.currency}")
let v: Price = (214.05, "USD")
let s: string = (%(v)).pretty
echo s # => "214.05 USD"
echo s == "214.05 USD" # => false, why?
echo proc can sometimes be deceptive in terms of representing strings, so I prefer to throw in the repr proc 确保以更清晰的方式表示字符串(和其他对象)。查看我在示例中添加以下行时得到的输出,代表比较的双方:
echo repr(s)
echo repr("214.05 USD")
==>
0x105f5c0b8"\"214.05 USD\""
0x105f1cf70"214.05 USD"
通过这个表示我们可以看出字符串确实是不相等的。您的 %
过程将 Price
元组的内容格式化为 space 分隔的字符串节点,并且 JSON pretty proc 将该字符串节点转换为它的 JSON 表示,这包括双引号。因此,为了使最后一个比较相等,我们需要这样写:
echo s == "\"214.05 USD\""
另一种可能性是编写访问 JsonNode.str
变体字段的比较,这避免涉及恶作剧 pretty
:
echo (%(v)).str == "214.05 USD"
JSON包生成的字符串不等于相同的字符串,为什么?
下面代码中的最后一个相等性检查是错误的,为什么? playground
import strformat, json
type Price = tuple[price: float, currency: string]
func `%`*(v: Price): JsonNode = %(fmt"{v.price} {v.currency}")
let v: Price = (214.05, "USD")
let s: string = (%(v)).pretty
echo s # => "214.05 USD"
echo s == "214.05 USD" # => false, why?
echo proc can sometimes be deceptive in terms of representing strings, so I prefer to throw in the repr proc 确保以更清晰的方式表示字符串(和其他对象)。查看我在示例中添加以下行时得到的输出,代表比较的双方:
echo repr(s)
echo repr("214.05 USD")
==>
0x105f5c0b8"\"214.05 USD\""
0x105f1cf70"214.05 USD"
通过这个表示我们可以看出字符串确实是不相等的。您的 %
过程将 Price
元组的内容格式化为 space 分隔的字符串节点,并且 JSON pretty proc 将该字符串节点转换为它的 JSON 表示,这包括双引号。因此,为了使最后一个比较相等,我们需要这样写:
echo s == "\"214.05 USD\""
另一种可能性是编写访问 JsonNode.str
变体字段的比较,这避免涉及恶作剧 pretty
:
echo (%(v)).str == "214.05 USD"