gpt4 book ai didi

ruby - 如何在匿名类定义中命名常量?

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

通过Class.new创建匿名类时,它们似乎没有自己的常量命名空间:

klass1 = Class.new do
FOO = "foo"
end

klass2 = Class.new do
FOO = "bar"
end

这给出了 warning: already initialized constant FOO 并且看起来是正确的:

> klass1.const_get(:FOO)
"bar"
> klass2.const_get(:FOO)
"bar"
> FOO
"bar"

我打算在一个简单的 DSL 中使用这种方法来为应用程序定义插件,如下所示:

class App
class AddonBase

attr_reader :session

def initialize(session)
@session = session
end
end

def self.addons
@addons ||= {}
end

def self.addon(name, &block)
addons[name] = Class.new(AddonBase, &block)
end
end

这适用于简单的附加组件,但如果定义常量,它们将在 Object:: 下,而不是成为 addons[name]::CONSTANT:

App.addon "addon1" do

PATH="/var/run/foo"

def execute
File.touch(PATH)
end
end

App.addon "addon2" do

PATH="/etc/app/config"

def execute
File.unlink(PATH)
end
end

# warning: already initialized constant PATH

常量可以是任何东西,附加组件甚至可以定义它们自己的实用程序子类,所以这不仅仅是用函数替换 PATH

有什么办法可以解决这个问题吗?

最佳答案

When creating anonymous classes through Class.new, they don't seem to have their own namespace for constants

他们有,你可以使用const_set在匿名类中定义常量:

klass1 = Class.new do
const_set(:FOO, 'foo')
end

klass2 = Class.new do
const_set(:FOO, 'bar')
end

klass1::FOO #=> "foo"
klass2::FOO #=> "bar"

或者通过self::

klass1 = Class.new do
self::FOO = 'foo'
end

klass2 = Class.new do
self::FOO = 'bar'
end

klass1::FOO #=> "foo"
klass2::FOO #=> "bar"

关于ruby - 如何在匿名类定义中命名常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51964661/

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