我正在尝试用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模块要少得多。
当然,我可以自己实现一个类来提供这个转换功能,但我宁愿知道这还没有完成,这样就不会重复发明轮子。
提前Tks。
发布于 2011-09-20 22:52:02
我认为类内部的实现非常简单,而且根本没有开销,所以我根本看不出使用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中的实现将是更高的一层:
StructWithType实例(而不是类)的new实现中使用类的转换器进行转换。它的第一个草图可能是这样的:
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[]必须写入)中的新值在新实例中存储新值来转换参数。因此,您必须实现结构的创建、转换器的查找、参数名称的查找和新实例的属性的设置器。抱歉,今天没时间了..。我之所以使用create,是因为new在Ruby语言中有不同的含义,我不想把它搞砸。
发布于 2011-10-14 01:16:53
我在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? # => truehttps://stackoverflow.com/questions/7487033
复制相似问题