我希望获得用户输入,然后对于每个单词输入,我想取第一个字母并显示它。例如,如果用户放置"Hello there"
,则它应返回"Ht"
。我不想使用map:chr
。如果您使用gsub
或split
获得理想的结果,您能解释一下它如何工作吗?
答案 0 :(得分:5)
我不确定您为什么不想使用map(&:chr)
,但以下是不使用它的解决方案:
def first_chars(string)
string # e.g. "Hello world"
.split(' ') # converts it to ["Hello", "world"]
.map { |word| word[0] } # converts it to ["H", "w"] (You could also use map(&:chr) here.)
.join # converts it to "Hw"
end
first_chars("Hello world") #=> "Hw"
这里要理解的关键部分是:
split
取一个String
并将其转换为{strong> Array
s的 String
(列表)。map
遍历Array
,并通过指定的操作转换每个项目。 (在这种情况下,只接受首字母。)join
将Array
合并回单个String
。答案 1 :(得分:5)
puts "Oh, happy day".gsub(/ |(?<=\S)./, '')
#=> "Ohd"
正则表达式读取,“匹配空格或(|
)匹配任何字符(.
),然后再匹配非空白(\S
),{{1} }是正向后看。
答案 2 :(得分:1)
这是我写的一种方法。
def first_chars
final_string = ""
self.split(" ").each do |word|
final_string += word.chr
end
return final_string
end
您可以像"hello world".first_chars
这样使用它,它会返回hw
。
这是什么:用空格将给定的字符串self分隔成一个数组。然后,它在.chr
循环中使用.each
方法添加该单词的第一个字母,然后将该字母附加到最终返回的字符串上。
可以这样缩短:
def first_chars
final_string = ""
self.split(" ").each { |word| final_string += word.chr }
return final_string
end