我应该如何在ruby中重构这个条件代码?
如何重构这个功能?
def split_description(first_n) description_lines = description.split "n" line_num = description_lines.length if line_num > first_n @description_first = to_html(description_lines[0..first_n].join("n")) @description_remain = to_html(description_lines[first_n + 1..line_num].join("n")) elsif line_num > 1 @description_first = to_html(description_lines[0..first_n].join("n")) @description_remain = '' else @description_first = '' @description_remain = '' end end 我是Ruby的首发,遇到这个rubocup警告:Method有太多行. [13/10] 以下是整个代码网址: 解决方法
码
def split_description(description,first_n) @description_first,@description_remain = case description.count("n") when 0..first_n [description,''] else partition_description(description,first_n) end.map(&:to_html) end def partition_description(description,first_n) return ['',description] if first_n.zero? offset = 0 description.each_line.with_index(1) do |s,i| offset += s.size return [description[0,offset],description[offset..-1]] if i == first_n end end 我假设to_html(”)#=> ”,但如果不是这样,修改就很简单了. 例 因此我们可以看到to_html的效果,让我们这样定义它. def to_html(description) description.upcase end description =<<_ It was the best of times it was the worst of times it was the age of wisdom it was the age of fools _ split_description(description,0) @description_first #=> "" @description_remain #=> "IT WAS THE BEST OF TIMESn..WORST OF TIMESn..AGE OF WISDOMn..AGE OF FOOLSn" split_description(description,1) @description_first #=> "IT WAS THE BEST OF TIMESn" @description_remain #=> "IT WAS THE WORST OF TIMESn..AGE OF WISDOMn..AGE OF FOOLSn" split_description(description,2) @description_first #=> "IT WAS THE BEST OF TIMESnIT WAS THE WORST OF TIMESn" @description_remain #=> "IT WAS THE AGE OF WISDOMnIT WAS THE AGE OF FOOLSn" split_description(description,3) @description_first #=> "IT WAS THE BEST OF TIMESn..WORST OF TIMESn..AGE OF WISDOMn" @description_remain #=> "IT WAS THE AGE OF FOOLSn" split_description(description,4) @description_first #=> "IT WAS THE BEST OF TIMESn..WORST OF TIMESn..AGE OF WISDOMn..AGE OF FOOLSn" @description_remain #=> "" 说明 首先,看起来描述是一个包含字符串的局部变量.如果是这样,它必须是方法的参数(以及first_n). def split_description(description,first_n) 我们想为两个实例变量赋值,所以让我们从写作开始 @description_first,@description_remain = 实际上有两个步骤:获取所需的字符串,然后使用to_html映射它们.所以让我们首先集中精力迈出第一步. 我们现在将调整字符串中的行数 case description.count("n") 首先,让我们来处理字符串不包含换行符的情况 when 0 [description,''] 如果字符串为空,则为[”,”];否则它将包含没有换行符的单个字符串. 接下来,假设字符串中的换行符数在1和first_n之间.在这种情况下,@ description_first将是整个字符串,而@description_remain将为空. when 1..first_n [description,''] 当0和1..first_n都返回相同的双元素数组时,我们可以将它们组合起来: when 0..first_n [description,''] 为了达到这个目的,first_n小于换行数.我已经使用另一种方法来处理换行数大于first_n的情况. else partition_description(description,first_n) partition_description只是确定第一个换行符描述的偏移量,然后相应地对字符串进行分区. 最后,我们需要结束case语句,映射用to_html返回的两个字符串的数组并结束方法 end.map(&:to_html) end 正如我之前提到的,我假设to_html(”)#=> ”.在我看来,这是处理空字符串的最佳位置. 请注意,我直接处理了字符串,而不是将字符串拆分为行,操纵行然后重新加入它们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |