我指的是 Ruby Koans 中 about_symbols.rb 中的这个测试https://github.com/edgecase/ruby_koans/blob/master/src/about_symbols.rb#L26 https://github.com/edgecase/ruby_koans/blob/master/src/about_symbols.rb#L26
def test_method_names_become_symbols
symbols_as_strings = Symbol.all_symbols.map { |x| x.to_s }
assert_equal true, symbols_as_strings.include?("test_method_names_become_symbols")
end
# THINK ABOUT IT:
#
# Why do we convert the list of symbols to strings and then compare
# against the string value rather than against symbols?
为什么我们必须首先将该列表转换为字符串?
这与符号的工作方式有关。对于每个符号,只有其中一个实际存在。在幕后,符号只是一个由名称(以冒号开头)引用的数字。因此,当比较两个符号的相等性时,您正在比较对象标识和not引用该符号的标识符的内容。
如果你要做简单的测试:测试==“测试”,这将是错误的。因此,如果要将迄今为止定义的所有符号收集到一个数组中,则需要先将它们转换为字符串,然后再进行比较。您不能以相反的方式执行此操作(首先将要比较的字符串转换为符号),因为这样做会创建该符号的单个实例,并用您正在测试是否存在的符号“污染”您的列表。
这有点奇怪,因为您必须测试符号是否存在,而不能在测试过程中意外创建该符号。您通常不会看到这样的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)