首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据结构转换为其他数据结构

将数据结构转换为其他数据结构
EN

Stack Overflow用户
提问于 2015-06-11 21:51:41
回答 1查看 376关注 0票数 2

我经常需要将某些类型的数据转换成其他数据(通常是字符串、数组和散列)。例如:

  • 输入:"a;simple;list"
  • expected_output[ { content: "a", length: 1 }, { content: "simple", length: 6 }, { content: "list", length: 4 } ]

这可以通过以下方式实现:

代码语言:javascript
复制
input.split(";").map{|s| { content: s, length: s.size } }

但我想在不同的地方使用转换。因此,我需要提供封装逻辑来实现和重用这一点。脑海中闪现出三种方式:

  1. 使用助手方法(将单个方法放入模块): 模块转换器扩展自def转换(输入)input.split(“;”).map{欧元/(内容: s,长度: s.size }}结束模块调用器Converter.convert(输入)结束
  2. 使用具有参数的专用类: 类转换器初始化( input ) @input =input end def转换@input.split(“;”).map{欧元/(S)\{内容: s,长度: s.size }}结束模块调用器Converter.new(输入).convert end
  3. 使用改进,使用猴子补丁在数据对象上创建一个方法,但让调用者决定是否应该包含它。 模块转换器精化字符串执行def转换self.split(“;”).map{ do /s\{ content: s,length: s.size } end end Caller使用转换器input.convert end

我对其中任何一种都不满意,但第三种选择似乎是最干净的,因为如果您处理自定义对象,通常会这样做。但它也感觉不对,因为它是猴子修补光。你的想法是什么?

EN

回答 1

Stack Overflow用户

发布于 2015-07-22 00:15:51

从面向对象的角度来看,这是很好的。

我喜欢你的第二个建议的一个变化,有一个小的区别--使用一个对象,但是不要实例化它。

代码语言:javascript
复制
class StringConverter
  def self.to_size_hash(string)
    string.split(';').map { |s| { content: s, length: s.size } }
  end
end


2.2.2 :001 > StringConverter.to_size_hash "a;simple;list"
 => [{:content=>"a", :length=>1}, {:content=>"simple", :length=>6}, {:content=>"list", :length=>4}]

只要这个类只做一件事,一次,我就想不出有什么好的理由把它保存在内存中。

这种方法的好处是,您可以将逻辑封装在StringConverter类中,而无需编写另一个模块(问题中的第一个选项),也不需要更改String类的预期行为(第三个选项)。它是用于此转换的专用类,您可以在任何需要它的地方使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30792078

复制
相关文章

相似问题

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