我正在尝试在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模块。
当然我可以自己实现一个提供这种转换功能的课程,但我想知道为了不重新发明轮子还没有完成。
事先提前。
答案 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
中的实现将更高一层:
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
这里的想法是:
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