0

我正在尝试在 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 是动态的,我不应该关心数据类型,但这种转换会很方便。

我要问的是类似于 ActiveRecord 已经做过的事情:将字符串转换为表列中定义的数据类型。

在搜索 ActiveModel 后,我无法弄清楚如何对一些进行此转换的 TableLess。

毕竟我认为我的问题可能需要 ActiveModel 模块提供的更少。

当然,我可以自己实现一个提供此转换功能的类,但我宁愿知道这还没有完成,以免重新发明轮子。

提前谢谢。

4

2 回答 2

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
于 2011-10-13T17:16:52.927 回答
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

那么in 的实现StructWithType会更高一层:

  • 为每种类型实现一个转换器。
  • 在类中绑定该转换器的实例。
  • 在实例(不是类)的new实现中使用StructWithType类的转换器来进行转换。

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

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 的实例方法,它从工厂创建一个新的结构实例。
  • 工厂遍历所有参数(带有索引)并搜索转换器要使用的每个参数。
  • 它使用转换器转换 arg。
  • 它将新值存储在新实例的 argname(argname[]必须写入方法)处。

因此,您必须实现结构的创建、转换器的查找、参数名称的查找以及新实例属性的设置器。抱歉,今天没时间了……我用过create是因为new在 Ruby 中有不同的含义,我不想搞砸了。

于 2011-09-20T14:52:01.830 回答