ruby-on-rails - Ruby:你能确定一个对象是否正在调用其方法之一吗?

标签 ruby-on-rails ruby class hash openstruct

我不确定我是否问了正确的问题。我可能错误地处理了这个问题,但基本上我这里有这种情况:

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/

相关文章:

ruby-on-rails - 在 Ruby on Rails 中声明关联

ruby-on-rails - form_for未定义的方法 `model_name'错误

Ruby:Proc#call 与 yield

ruby-on-rails - gem install pg for ruby​​ on rails

javascript - 如何从方法访问构造函数中声明的变量?

Java Class.forName 和混淆名称,java 找不到类

ruby-on-rails - 如何调试插件/gem? (附有设置和使用 ruby​​-debug gem 的有用说明)

ruby-on-rails - 如何将 Rails 项目中的迁移文件设为 "clean up"?

ruby - RSpec 在使用 -f 格式化程序时抛出参数错误

c++ - 从另一个类调用类函数?