gpt4 book ai didi

ruby - 将动态定义的类作为常量访问仅适用于 const_get

转载 作者:数据小太阳 更新时间:2023-10-29 07:55:04 29 4
gpt4 key购买 nike

给定以下示例:

[1] pry(main)>
[2] pry(main)> module Foo
[2] pry(main)* Foo = 'LOL'
[2] pry(main)* ['Lol'].each do |elem|
[2] pry(main)* @elem = elem
[2] pry(main)* Object.const_set "Bar#{elem}", Class.new { def butts; puts "#{@elem}" end; }
[2] pry(main)* end
[2] pry(main)* end
=> ["Lol"]
[3] pry(main)> Foo.constants
=> [:Foo]
[4] pry(main)> Foo.const_get('BarLol')
=> BarLol
[5] pry(main)> Foo::Foo
=> "LOL"
[6] pry(main)> Foo::BarLol
NameError: uninitialized constant Foo::BarLol
from (pry):11:in `<main>'
[7] pry(main)>
  1. 为什么当我执行 Foo.constants 时它返回一个常量。它不应该返回 [:Foo, :BarLol] 吗?

  2. 另外,为什么访问动态定义常量值的唯一方法是执行 Foo.const_get('BarLol')?为什么 Foo::BarLol 不起作用?

最佳答案

问题是你在 Object 的范围而不是 Foo 的范围内设置 BarLol 常量,一个小的改变就可以了:

module Foo
Foo = 'LOL'
['Lol'].each do |elem|
@elem = elem
::Foo.const_set "Bar#{elem}", Class.new { def butts; puts "#{@elem}" end; }
end
end

p Foo.constants
#=> [:Foo, :BarLol]
p Foo.const_get('BarLol')
#=> Foo::BarLol
p Foo::Foo
#=> "LOL"
p Foo::BarLol
#=> Foo::BarLol

关于ruby - 将动态定义的类作为常量访问仅适用于 const_get,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41627107/

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