You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:57:37