我经常需要将某种数据转换为其他数据(通常是字符串,数组和散列)。例如:将数据结构转换为其他数据结构
- 输入:
"a;simple;list"
expected_output
:[ { content: "a", length: 1 }, { content: "simple", length: 6 }, { content: "list", length: 4 } ]
这可以这样做:
input.split(";").map{|s| { content: s, length: s.size } }
,但我想在不同的地方使用转换。所以我需要提供封装的逻辑来实现和重用这个。三种方式跳进脑海:
使用一个辅助方法(把一个单一的方法到一个模块):
module Converter extend self def convert(input) input.split(";").map{|s| { content: s, length: s.size } } end end module Caller Converter.convert(input) end
使用专用类参数:
class Converter def initialize(input) @input = input end def convert @input.split(";").map{|s| { content: s, length: s.size } } end end module Caller Converter.new(input).convert end
使用优化,使用猴子修补在数据对象上创建一个方法,但让调用者决定是否应该包含该方法。
module Converter refine String do def convert self.split(";").map{|s| { content: s, length: s.size } } end end end module Caller using Converter input.convert end
我有任何不满意他们的,但第三个选择似乎最干净的,因为这通常是如果你对付的自定义对象,你会做什么。但它也感觉不对,因为它是猴子修补灯。你怎么看?
第三个选项基本上是如何使用精化。 –
这些都不会给你'expected_output'。 – sawa
你说得对,我把'expected_output'全部改为符号,现在应该是对的 – leifg