gpt4 book ai didi

ruby - 我可以创建一个透明地呈现方法和变量的类吗?

转载 作者:太空宇宙 更新时间:2023-11-03 16:02:14 24 4
gpt4 key购买 nike

我想用 Ruby 做一些配置文件工作。配置的某些元素名义上依赖于其他元素,但不一定。

例如,在使用配置时,我想这样做:

require_relative "config" 
require_relative "overrides"
dosomething_with(Config.libpath)

在“配置”中,我想要这样的东西:

require 'ostruct'
Config = OpenStruct.new
Config.basepath = "/usr"
Config.libpath = lambda {Config.basepath + "/lib"} # this is not quite what I want

在“overrides”中,用户可能会覆盖 Config.basepath,我希望 Config.libpath 取自然值。但用户可能Config.libpath 重写为某个常量。

我希望能够只说 Config.libpath 并获得计算值(如果它没有被覆盖)或定义值(如果它有)。

这是我会用 Ruby 做的事情吗?这似乎是我所见 OpenStruct 工作方式的自然延伸。

最佳答案

这个怎么样:

require 'ostruct'

Config = OpenStruct.new
Config.basepath = "/usr"

def Config.libpath
# Suggested by Nathaniel himself
@table[:libpath] || basepath + "/lib"

# The next alternatives require def Config.libpath=(libpath) ...
# instance_variable_defined?(:@libpath) ? @libpath : basepath + "/lib"
# or
# @libpath || basepath + "/lib" , depending on your needings
end

# Needed only if @table[:libpath] is not used
# def Config.libpath=(libpath)
# @libpath = libpath
# end

# Default basepath, default libpath
p Config.libpath #=> "/usr/lib"

# custom basepath, default libpath
Config.basepath = "/var"
p Config.libpath #=> "/var/lib"

# Custom libpath
Config.libpath = '/lib'
p Config.libpath #=> "/lib"

关于ruby - 我可以创建一个透明地呈现方法和变量的类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21864331/

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