通过Ruby中的哈希使实例变量可访问

时间:2015-06-22 10:12:27

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

在Rails,ActiveRecord对象中,属性可以通过方法和Hash访问。例如:

user = User.first  # Assuming User to be inheriting from ActiveRecord::Base
user.name # Accessing attribute 'name' via method
user[:name] # Attribute 'name' is accessible via hash as well

如何通过散列访问实例变量,以便不继承ActiveRecord::Base

的类

2 个答案:

答案 0 :(得分:3)

它不是"通过Hash"它是"阵列访问"操作

要实现它,您需要定义方法:

def [](*keys)
  # Define here
end

def []=(*keys, value)
  # Define here
end

当然,如果您不能使用多个键来访问元素,那么仅使用key代替*keys就可以了,所以您还没有键数组(即使只给出一个键),但只有一个键。

很多其他类实现它,即Struct,因此您可以自由选择现有的实现或推出自己的实现。

让实例变量受这些方法的影响意味着使用instance_variable_get / instance_variable_set来实现它们。没什么好看的。

答案 1 :(得分:0)

一般来说,为了使属性可用作Hash和/或getter / setter,您可以将属性存储在单个Hash中,并提供相应的getter / setter方法。

这是一个非常简单的功能,您可以轻松地直接编入目标类。

在Ruby中,还有一些内置库提供了类似的功能,方法略有不同:StructOpenStruct

以下是使用Struct定义对象的示例。

Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)

joe["name"]   #=> "Joe Smith"
joe[:name]    #=> "Joe Smith"
joe[0]        #=> "Joe Smith"

如果您使用的是Rails,则还可以包含ActiveModel::Model以获得类似ActiveRecord的功能。