使用case语句查找索引并返回它

时间:2016-08-08 14:55:38

标签: ruby median case-statement

整个上午玩完这个(我还是新手),我决定问专家。

这是任务:

你会得到一个字。 你的工作是返回单词的中间字符。 如果单词的长度为奇数,则返回中间字符。 如果单词的长度是偶数,则返回中间2个字符。

这是我到目前为止所做的:

def median(string)                           
      array = string.split(//) 
      case array
      when array.length == 1  
        return array[0]
      when array.length == 2
        return array[0] + array[1]                
      when array.length.odd? && array.length >= 3                   
        return array[(array.length - 1) / 2] 
      when array.length.even? && array.length >= 4              
        return array[((array.length / 2 ) - 1)] + array[(array.length / 2)]
        else nil
      end
end



puts median("testing")

我的代码出了什么问题。它运行但没有任何东西。任何帮助非常感谢。

1 个答案:

答案 0 :(得分:1)

您需要从第array行中删除case array。我只对您的代码进行了此更改,works just fine

def median(string)                           
  array = string.split(//) 
  case
  when array.length == 1  
    return array[0]
  when array.length == 2
    return array[0] + array[1]                
  when array.length.odd? && array.length >= 3                   
    return array[(array.length - 1) / 2] 
  when array.length.even? && array.length >= 4              
    return array[((array.length / 2 ) - 1)] + array[(array.length / 2)]
  else nil
  end
end

在代码的初始版本中,case array意味着在每个分支上Ruby会将“when”值(总是一个布尔值)与数组进行比较,该数组永远不会是布尔值,因此永远不会等于任何一个分支。这就是else nil分支始终是case块的退出点的原因。

case array更改为case将告诉Ruby它不需要执行比较,而是评估每个分支条件并执行第一个真实的分支条件。

话虽如此,您的代码可以通过以下几种方式简化:

  • 没有必要将字符串转换为数组;在这种情况下,字符串索引可以正常工作
  • 条件&& array.length >= 3&& array.length >= 4是多余的;较低的值会触及array.length == 1array.length == 2分支
  • array.length == 1array.length == 2分支真的不那么特别;你可以在奇数/偶数长度的情况下对待它们。

应用这些注意事项后,我最终得到了这段代码,works OK

def word_median(word)
  half = word.length / 2

  case
  when word == '' then ''
  when word.length.odd? then word[half]
  else word[half - 1..half]
  end
end