gpt4 book ai didi

ruby 公案 : Constants become symbols

转载 作者:数据小太阳 更新时间:2023-10-29 06:44:13 26 4
gpt4 key购买 nike

在 about_symbols.rb Ruby Koan (https://github.com/edgecase/ruby_koans) 中,我有以下代码:

    RubyConstant = "What is the sound of one hand clapping?"
def test_constants_become_symbols
all_symbols = Symbol.all_symbols

assert_equal true, all_symbols.include?(:"nonexistent")

assert_equal true, all_symbols.include?(:"What is the sound of one hand clapping?")
assert_equal true, all_symbols.include?("What is the sound of one hand clapping?".to_sym)
end

照原样,测试通过。

三个问题:

  1. 为什么第一个断言通过了? :"nonexistent"不应该包含在 all_symbols 中,但它包含在内,所以我一定是误解了什么。

  2. 当我注释掉第二个断言时,测试失败,因为 "What is the sound of one hand clapping?".to_sym不包含在 all_symbols 而 :"What is the sound of one hand clapping?"已经包括了。既然是等价的,为什么最后一个assert会失败呢?另外,为什么当第二个断言没有被注释掉时它通过了? (为什么第二个断言对第三个断言有影响?)

  3. 据我所知,这个 Ruby Koan 的目的是证明常量变成了符号(至少,这是我从方法名称中推断出来的)。由于 RubyConstant 是一个值为 "What is the sound of one hand clapping?" 的常量, 为什么不是 "What is the sound of one hand clapping?".to_sym包含在符号列表中?我能想到的唯一解释是,与方法名称相反,常量实际上并没有变成符号。

感谢您的帮助!

最佳答案

hoha 说得对,但我会尝试扩展和澄清一点。

解释器在解析test_constants_become_symbols 时会创建:nonexistent 符号。然后,当您运行它时,将调用 Symbol.all_symbols 以获取所有已知符号的列表,并且 :nonexistent 位于列表中。另请注意,"nonexistent" 上的双引号是语法问题而不是内部表示问题,因此 :nonexistent:"nonexistent" 是同样的事情。

如果你注释掉这个:

  assert_equal true, all_symbols.include?(:"What is the sound of one hand clapping?")

那么 :"What is the sound of one hand clapping?" 符号将不会被解析器看到,因此它不会出现在 all_symbols 数组中.执行test_constants_become_symbols时会执行下面一行的.to_sym方法调用;所以,:"What is the sound of one hand clapping?" 符号是在你得到你的 all_symbols 之后创建的,这将失败:

  assert_equal true, all_symbols.include?("What is the sound of one hand clapping?".to_sym)

如果你在同一个解释器实例中再次执行 test_constants_become_symbols(第二个 assert_equal 仍然被注释掉)那么两个未注释的 assert_equal 调用都会通过因为第一次运行 test_constants_become_symbols 将创建 :"What is the sound of one hand clapping?" 而第二个 Symbol.all_symbols 将包括它在返回的数组中。

irb 中运行您的代码而不将其包装在 def 中可能有助于您了解发生了什么。

关于 ruby 公案 : Constants become symbols,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5358727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com