在方法中调用方法以在Ruby中标题化

时间:2013-04-21 08:53:30

标签: ruby capitalize

我正在尝试为编程任务创建一个标题化方法,它会使某些单词大写并忽略其他单词。它总是将第一个词大写。为此,我创建了一个方法来查找字符串的第一个单词,并尝试在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 个答案:

答案 0 :(得分:1)

更改以下内容

elsif word != 'and' or 'the'

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

答案 1 :(得分: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)

答案 2 :(得分: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

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

所以解决方法如下:

p "hi" if str == '1' or str == '12' #=> "hi"
p "hi" if ['1','12'].include? str #=> "hi"

答案 3 :(得分:0)

不确定这是多么可读。但它很短!

def titleize(str)
  str.capitalize.split.map do |word|
    %w{and the}.include?(word.downcase) ? word : word.capitalize
  end.join(' ')
end