整个上午玩完这个(我还是新手),我决定问专家。
这是任务:
你会得到一个字。 你的工作是返回单词的中间字符。 如果单词的长度为奇数,则返回中间字符。 如果单词的长度是偶数,则返回中间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")
我的代码出了什么问题。它运行但没有任何东西。任何帮助非常感谢。
答案 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 == 1
或array.length == 2
分支array.length == 1
或array.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