gpt4 book ai didi

ruby - 如何在 Ruby 中像这样设置哈希实例的值?

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

我有两个类 A 和 B,它们都有一些选项,通常我会使用一个 Hash 来存储选项,如 @options[:name]='xxxx';现在我想用元编程重构它,

class A
set_option :name, "james"
set_option :address, "some street"

def hello
puts @options[:name]
puts @options[:address]
end
end


class B
set_option :age, 18

def greeting
put @options[:age]
end
end

这里我想使用set_option将键值对设置为一个哈希实例@options,我该怎么做呢?

此外,我想将解决方案包装到一个单独的模块中。

更新:

首先感谢,你所有的回答对我都很有值(value),让我更清楚,现在我意识到我想要的东西不是那么正确,所以如果我这样提问题呢?

  • 使用一种方法 option 来替换 @options 怎么样?
  • A 类和 B 类都可以为同一个键设置不同的选项,所以可能某些答案的 @@options 不起作用?我希望不同的类可以有不同的哈希实例。

```像这样:

class A
set_option :name, "james"
set_option :provider, 'twitter'

def hello
puts option[:name]
end
end


class B
set_option :name, "not james"

def greeting
put option[:name]
end
end

经过深思熟虑,我认为我真正想要的是不同类的不同选项哈希实例,而不是类的实例。

这是我想要的,它可以工作。

module HasOptions
def self.included(cls)
cls.class_eval do
def self.set_option(key, value)
options[key] = value
end

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

def options
self.class.options
end
end
end
end


class Baz
include HasOptions
set_option :name, "bad"

def greeting
puts options[:name]
end
end

class Foo
include HasOptions
set_option :name, "foo"

def greeting
puts options[:name]
end
end

感谢您的帮助。

最佳答案

如您所尝试的那样,使用实例变量是行不通的。但是,您可以使用这样的方法:

module HasOptions
def self.included(cls)
cls.class_eval do
def self.set_option(key, value)
(@@options ||= {})[key] = value
end
end
end

def options
@options ||= @@options.dup
end
end

此实现允许您设置每个实例的选项,而不会覆盖所有实例的通用选项。

关于ruby - 如何在 Ruby 中像这样设置哈希实例的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14919071/

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