首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有类型和转换的结构

带有类型和转换的结构
EN

Stack Overflow用户
提问于 2011-09-20 22:39:20
回答 2查看 325关注 0票数 0

我正在尝试用Ruby完成以下工作:

代码语言:javascript
运行
复制
person_struct = StructWithType.new "Person", 
                                   :name => String, 
                                   :age => Fixnum, 
                                   :money_into_bank_account => Float

我希望它能接受这两种情况:

代码语言:javascript
运行
复制
person_struct.new "Some Name",10,100000.0

代码语言:javascript
运行
复制
person_struct.new "Some Name","10","100000.0"

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

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

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

在搜索了ActiveModel之后,我想不出如何去找一些做这个转换的TableLess。

毕竟,我认为我的问题可能需要的ActiveModel模块要少得多。

当然,我可以自己实现一个类来提供这个转换功能,但我宁愿知道这还没有完成,这样就不会重复发明轮子。

提前Tks。

EN

回答 2

Stack Overflow用户

发布于 2011-09-20 22:52:02

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

类中的实现应该是:

代码语言:javascript
运行
复制
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实现中使用类的转换器进行转换。

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

代码语言:javascript
运行
复制
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的实例方法,它从工厂创建一个新的结构实例。converter.
  • It
  • 工厂遍历所有参数(带有索引)并搜索转换器要使用的每个参数。
  • 它使用参数名(方法argname[]必须写入)中的新值在新实例中存储新值来转换参数。

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

票数 0
EN

Stack Overflow用户

发布于 2011-10-14 01:16:53

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

使用示例:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7487033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档