我的Title
课程要求如下。
"the united states"
这样的全小写字符串,并将每个单词的首字母大写("The United States"
)。"ThE UnIted STatEs"
这样的驼峰字符串字符串并将其设为"The United States"
。以下代码满足它们:
class Title
attr_accessor :string
def initialize(string)
@string = string
end
def fix
string2 = string.split(" ").map{ |string| string.capitalize }.join(" ")
end
end
我添加了另一个条件:
"the"
,"The"
,"of"
,"Of"
,则不会将其大写。使用以下fix
逻辑修改map
的尝试不起作用:
class Title
def fix
string2 = string.split(" ").map{ |string| string.capitalize }.join(" ")
string2.split(" ").map{ |string| (string.include?("of","Of","the","The") ? string.downcase : string.capitalize) }.join(" ")
end
end
#=> Error: wrong number of arguments (2 for 1)
我还有另一种方法可以实现这种逻辑吗?我不确定为什么这对我不起作用。任何人都可以提供任何帮助/指导吗?
答案 0 :(得分:1)
String#include只接受一个参数,这就是ArgumentError的来源。相反,你可以做类似的事情:
[8] pry(main)> prepositions = ["of", "Of", "the", "The"]
=> ["of", "Of", "the", "The"]
[9] pry(main)> string2.split(" ").map{ |string| prepositions.include?(string) ? string.downcase : string.capitalize }.join(" ")
=> "of Thy Self In the Capital"
我更喜欢上述内容,它允许您轻松保留超出正常大小写方法的单词列表。它易于阅读,易于添加等。也就是说,您可以使用不区分大小写的正则表达式匹配:
string2.split(" ").map{ |string| string.match(/(the)|(of)/i) ? string.downcase : string.capitalize }.join(" ")
答案 1 :(得分:1)
使用gsub
您不需要将字符串转换为单词数组,映射单词,然后join
。相反,只需使用带有块的String#gsub形式。
<强> 强>
Little Words
你说你不想把某些单词弄清楚。编辑经常将这些词称为"little words"。让我们来定义一些:
LITTLE_WORDS = %w{ the of for a an or and } #=> ["the", "of", "for", "a", "an", "or", "and"]
<强>代码强>
我认为遇到的所有小词都会被低估,所有其他词语都会被低估和大写。我们可以这样做:
def fix(str)
str.gsub(/\w+/) do |w|
if LITTLE_WORDS.include?(w.downcase)
w.downcase
else
w.capitalize
end
end
end
<强>实施例强>
让我们试一试:
fix("days of wine aNd roses") #=> "Days of Wine and Roses"
fix("of mice and meN") #=> "of Mice and Men"
嗯。第二个例子有点问题。据推测,我们应该把第一个词大写,不管它是否是一个小词。有很多方法可以做到这一点。
#1修改所有单词后将第一个单词大写
def fix(str)
str.gsub(/\w+/) do |w|
if LITTLE_WORDS.include?(w.downcase)
w.downcase
else
w.capitalize
end
end.sub(/^(\w+)/) { |s| s.capitalize }
end
fix("of mice and men")
#=> "Of Mice and Men"
请注意,我在正则表达式中引入了一个捕获组。或者,您可以将倒数第二行更改为:
end.sub(/^(\w+)/) { $1.capitalize }
#2设置标记
def fix(str)
first_word = true
str.gsub(/\w+/) do |w|
if LITTLE_WORDS.include?(w.downcase) && !first_word
w.downcase
else
first_word = false
w.capitalize
end
end
end
fix("of mice and men")
#=> "Of Mice and Men"
#3使用索引
def fix(str)
str.gsub(/\w+/).with_index do |w,i|
if LITTLE_WORDS.include?(w.downcase) && i > 0
w.downcase
else
w.capitalize
end
end
end
fix("of mice and men")
#=> "Of Mice and Men"
#4修改正则表达式
def fix(str)
str.gsub(/(^\w+)|\w+/) do |w|
if $1.nil? && LITTLE_WORDS.include?(w.downcase)
w.downcase
else
w.capitalize
end
end
end
fix("of mice and men")
#=> "Of Mice and Men"
更多问题
现在我们需要修复:
fix("I bought an iPhone and a TV")
#=> "I Bought an Iphone and a Tv"