0

我正在尝试为编程作业创建一个标题化方法,它将某些单词大写并忽略其他单词。它总是将第一个单词大写。为此,我做了一个查找字符串第一个单词的方法,并尝试在 titleize 方法中调用它。我收到一条错误消息,上面写着“警告:条件中的字符串文字”。我试过改变 if 循环的措辞,但这并没有解决我的错误。谁能向我解释为什么我的代码被破坏了?非常感谢你的帮助!

def first_word(str)
    array = str.split(' ')
    return array[0]
end

def titleize(str)
    words = str.split
    words.each do |word| 
        if word != first_word(str)
            word.capitalize!
        elsif word != 'and' or 'the'
            word.capitalize!
        end
        words.join ' '
    end
end
4

4 回答 4

1

运算符!=的优先级高于or。这意味着这条线

elsif word != 'and' or 'the'

相当于

elsif (word != 'and') or 'the'

而不是

elsif word != ('and' or 'the')

正如您可能预期的那样。后一个等价应表示为

elsif word != 'and' or word != 'the'

但即使在这种情况下,它也没有多大意义,而且很难阅读。

您可能希望将链接更改为

elsif !%w(and the).include?(word)
于 2013-04-21T09:13:25.830 回答
1
str = 'abc'
p "hi" if str == '1' or '12'
#=> warning: string literal in condition

或者

str = 'abc'
p "hi" if (str == '1' or '12')
#=> warning: string literal in condition
p "hi" if '12'
#=> warning: string literal in condition

这发生在 ruby​​ 解释器看到您的代码如下:

p "hi" if str == '1' or true

第二个将始终评估为真,因为'12'始终存在。警告是说,你有一个字符串文字,而不是一个booleanor ,它总是计算为。test'12'true

所以修复如下:

p "hi" if str == '1' or str == '12' #=> "hi"
p "hi" if ['1','12'].include? str #=> "hi"
于 2013-04-21T09:18:24.850 回答
1

更改以下内容

elsif word != 'and' or 'the'

elsif word != 'and' or word != 'the'
于 2013-04-21T08:58:46.057 回答
0

不确定它的可读性如何。但是很短!

def titleize(str)
  str.capitalize.split.map do |word|
    %w{and the}.include?(word.downcase) ? word : word.capitalize
  end.join(' ')
end
于 2013-04-21T11:59:30.163 回答