gpt4 book ai didi

ruby-on-rails - 带有默认值 : how to DRY? 的参数散列的 Ruby 方法

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

我有一个 initialize 方法,它接受一个散列来设置一些实例变量。这基本上就是我想要做的:

class Ad
DEFAULT_PAGE = 'index'.freeze

DEFAULT_CHANNEL = 'general'.freeze

DEFAULT_AREA = 'general'.freeze

attr_accessor :page, :area, :channel

def initialize args={}
@page = args[:page] || DEFAULT_PAGE
@area = args[:area] || DEFAULT_AREA
@channel = args[:channel] || DEFAULT_CHANNEL
end

# ...
end

我看到了允许动态设置实例变量的提示,但我不确定如何同时包含默认值...

  def initialize args={}
args.each do |attr,val|
instance_variable_set("@#{attr}", val) unless val.nil?
end
end

我可以动态引用常量吗?或者任何更好的方法来做这种事情都是受欢迎的!

...我还意识到 attr_accessor 变量可以单独设置。但我只想这样做。 :)

最佳答案

如果它们在您的 defaults 散列中,这也只会创建实例变量,这样您就不会不小心创建/覆盖其他实例变量。

我假设你的意思是 unless val.nil?:

def initialize(args={})
defaults = {
:page => DEFAULT_PAGE,
:area => DEFAULT_AREA,
:channel => DEFAULT_CHANNEL
}.merge(args).each do |attr, val|
instance_variable_set("@#{attr}", val) if defaults.has_key?(attr) && (not val.nil?)
end if args
end

关于ruby-on-rails - 带有默认值 : how to DRY? 的参数散列的 Ruby 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5931313/

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