Ruby代码未正确实现书名大小写规则问题求助
解决Ruby书名大小写的逻辑问题
嘿,我一眼就看到你代码里的两个关键问题,导致第二个"The"被错误大写了!咱们一步步拆解:
问题1:运算符优先级搞乱了判断逻辑
你原来的条件判断写法因为and和or的优先级问题,完全没有正确表达「虚词且非开头才不大写」的逻辑。Ruby里and的优先级比or高,所以你的条件:
if x == 'and' or x == 'in' or x == 'of' or x == 'the' or x == 'a' or x == 'an' and index != 0
会被解析成:
if (x == 'and') || (x == 'in') || (x == 'of') || (x == 'the') || (x == 'a') || (x == 'an' && index != 0)
也就是说,只有"an"会判断是否在开头,其他虚词(比如"the")的判断逻辑完全不符合预期,导致本该小写的单词被错误大写。
问题2:用index方法获取索引的坑
@title.index(x)会返回数组中第一个匹配x的元素的索引,而不是当前迭代元素的真实索引!比如你的标题里有两个"the",当处理第二个"the"时,index会返回第一个"the"的位置(0),这直接导致index != 0的判断失效,逻辑彻底出错。
修正后的代码
咱们把逻辑理顺,用更可靠的方式实现:
class Book attr_accessor :title def title=(input_title) # 把需要小写的虚词放在数组里,方便判断和维护 small_words = %w(and in of the a an) @title = input_title.split.map.with_index do |word, idx| # 核心逻辑:第一个单词必须大写,非虚词也必须大写;否则统一转小写 if idx == 0 || !small_words.include?(word.downcase) word.capitalize else word.downcase end end.join(' ') end end
关键改进点:
- 用
%w()定义虚词数组,比一连串==判断简洁易读 - 用
map.with_index直接获取当前元素的真实索引,彻底避免重复单词的索引错误 - 明确判断逻辑:要么是第一个单词,要么不是虚词,就大写;否则统一转小写(兼容输入中虚词原本大写的情况)
- 用
word.downcase匹配虚词,确保不管输入的虚词是大写还是小写都能正确识别
测试一下:输入"the man in the iron mask",会得到预期的"The Man in the Iron Mask",完美解决你的问题!
内容的提问来源于stack exchange,提问作者hfesoio
相关产品推荐
相关产品推荐

