具有类型和转换的结构

时间:2011-09-20 14:39:20

标签: ruby-on-rails ruby activerecord struct activemodel

我正在尝试在Ruby中完成以下内容:

person_struct = StructWithType.new "Person", 
                                   :name => String, 
                                   :age => Fixnum, 
                                   :money_into_bank_account => Float

我希望它同时接受:

person_struct.new "Some Name",10,100000.0

person_struct.new "Some Name","10","100000.0"

也就是说,我希望它能自动进行数据转换。

我知道Ruby是dinamically,我不应该关心数据类型,但这种转换会很方便。

我要问的是与ActiveRecord类似的东西:将String转换为表格列中定义的数据类型。

在搜索到ActiveModel后,我无法弄清楚如何进行这种转换的TableLess。

毕竟我认为我的问题可能需要的功能远远少于ActiveModel模块。

当然我可以自己实现一个提供这种转换功能的课程,但我想知道为了不重新发明轮子还没有完成。

事先提前。

2 个答案:

答案 0 :(得分:0)

我认为类中的实现非常简单,根本没有开销,所以我根本没有看到使用StructWithType的原因。 Ruby不仅是动态的,而且在存储实例方面非常有效。只要您不使用属性,就没有。

课程中的实现应该是:

def initialize(name, age, money_into_bank_account)
  self.name = name
  self.age = age.to_i
  self.money_into_bank_account = money_into_bank_account.to_f
end

StructWithType中的实现将更高一层:

  • 为每种类型的转换器实施。
  • 在班级中绑定该转换器的实例。
  • newStructWithType个实例(不是类)的实现中使用该类的转换器进行转换。

它的第一个草图可能是这样的:

class StructWithType
  def create(args*)
    <Some code to create new_inst>
    args.each_with_index do |arg,index|
      new_value = self.converter[index].convert(arg)
      new_inst[argname[index]]= new_value
    end
  end
end

这里的想法是:

  • 您有一个名为create的实例方法,它从工厂创建一个新的struct实例。
  • 工厂遍历所有args(带索引)并搜索转换器要使用的每个arg。
  • 它使用转换器转换arg。
  • 它存储在argname的新实例中(方法argname[]必须写入)新值。

因此,您必须实现struct的创建,转换器的查找,参数名称的查找以及新实例的属性的setter。对不起,今天没有时间...... 我使用create因为new在Ruby中有不同的含义,我不想搞砸它。

答案 1 :(得分:0)

我在github中找到了一个满足我的一些要求的项目:ActiveHash。 即使我仍然需要为每种类型创建一个类,但类型转换是免费的。 我试试看。

用法示例:

class Country < ActiveHash::Base
  self.data = [
                {:id => 1, :name => "US"},
                {:id => 2, :name => "Canada"}
              ]
end

country = Country.new(:name => "Mexico")
country.name  # => "Mexico"
country.name? # => true