我不确定我是否问了正确的问题。我可能错误地处理了这个问题,但基本上我这里有这种情况:
obj = get_user(params)
obj.profile => {:name => "John D", :age => 40, :sex => "male"} #Has to be of class Hash
obj.profile.name => "John D"
obj.profile[:name] => "John D"
obj.profile.job => nil
所以基本上,我必须满足所有这些条件,但我不确定如何解决这个问题(我今天刚学了 Ruby)。
请注意用于访问内部变量的点符号,否则我的 profile 就会是符号的哈希值。所以我尝试了两种方法,这只能让我到达那里
方法 1:将配置文件设为 OpenStruct
因此,这允许我使用点表示法访问姓名、年龄和性别,如果键不存在,它会自动返回 nil,但是 obj.profile 的类型为 OpenStruct 而不是 Hash
方法 2:将配置文件设为自己的类
这样,我将它们设置为实例变量,如果它们不存在,我可以使用 method_missing 返回 nil。但是,我再次遇到 obj.profile 类型/类不正确的问题
我有什么遗漏的吗?有没有办法区分
obj.profile
obj.profile.name
在 getter 函数中并返回哈希值或其他?
我可以更改配置文件的自定义类返回的内容,以便它返回哈希值吗?
我什至尝试检查 obj.profile 的 get 函数中的 args 和 **kwargs,但它们似乎都没有帮助,或者在我调用时填充obj.profile.something
最佳答案
如果它绝对必须是哈希
:
require 'pp'
module JSHash
refine Hash do
def method_missing(name, *args, &block)
if !args.empty? || block
super(name, *args, &block)
else
self[name]
end
end
end
end
using JSHash
profile = {:name => "John D", :age => 40, :sex => "male"}
pp profile.name # "John D"
pp profile[:name] # "John D"
pp profile.job # nil
pp profile.class # Hash
但最好不要成为哈希
,除非绝对需要:
require 'pp'
class Profile < Hash
def initialize(hash)
self.merge!(hash)
end
def method_missing(name, *args, &block)
if !args.empty? || block
super(name, *args, &block)
else
self[name]
end
end
end
profile = Profile.new({:name => "John D", :age => 40, :sex => "male"})
pp profile.name
pp profile[:name]
pp profile.job
关于ruby-on-rails - Ruby:你能确定一个对象是否正在调用其方法之一吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28622535/