Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何获得每个单词的第一个字母_Ruby - Fatal编程技术网

Ruby 如何获得每个单词的第一个字母

Ruby 如何获得每个单词的第一个字母,ruby,Ruby,我希望获得用户输入,然后对于每个单词输入,我希望获取第一个字母并显示它。例如,如果用户将Hello放在那里,它应该返回Ht。我不想使用map:chr。如果您使用gsub或split来获得所需的结果,您能解释一下它是如何工作的吗?下面是我编写的一个方法 def first_chars 最终字符串= self.split.每个do |单词| final_string+=word.chr 终止 返回最终字符串 终止 您可以像helloworld.first_chars那样使用它,它将返回hw 它的作用

我希望获得用户输入,然后对于每个单词输入,我希望获取第一个字母并显示它。例如,如果用户将Hello放在那里,它应该返回Ht。我不想使用map:chr。如果您使用gsub或split来获得所需的结果,您能解释一下它是如何工作的吗?

下面是我编写的一个方法

def first_chars 最终字符串= self.split.每个do |单词| final_string+=word.chr 终止 返回最终字符串 终止 您可以像helloworld.first_chars那样使用它,它将返回hw

它的作用是:将给定的字符串self按空格拆分为一个数组。然后,它使用.each循环中的.chr方法添加该单词的第一个字母,并将该字母附加到一个字符串中,该字符串最终返回

可以这样缩短:

def first_chars 最终字符串= self.split.each{| word | final_string+=word.chr} 返回最终字符串 终止
我不确定您为什么不想使用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获取字符串并将其转换为字符串数组列表。 映射在数组中循环,并通过指定的操作转换每个项。在这种情况下,只取第一个字母。 join将数组合并回单个字符串。
正则表达式读取、匹配空格或|匹配任何字符。前面有任何非空白字符,到目前为止您尝试了什么?你被困在哪里了?为什么不使用map&:chr?不管怎样,你已经接受的解决问题的答案仍然是这样的——唯一的区别是它在一个单独的步骤中进行拆分,并使用每个步骤而不是映射;附加到结果数组。所有的实例变量是什么?这个答案的代码具有不必要的复杂性。也许这就是落选的原因。不要为此而紧张。虽然我们都很欣赏您的贡献,但这种使用实例变量的方式并不合适,最终会助长坏习惯。与其如此消极地看待反馈,不如考虑它,成为一名更好的程序员。Ruby的一个真正优点是,要获得正确的结果,您所需要做的事情非常少。在这种情况下:string.split.map&:chr.join就足够了。您的解决方案是可行的,但可能要小得多,比如省略return并使用map而不是each。当您想从每个元素返回某些内容时,请始终使用map。这里使用chr的解决方案实际上比其他解决方案更简单,并避免落入正则表达式陷阱,但这在其他正在进行的工作中丢失了,这使得它看起来更复杂和冗长。如果你把所有的谷壳都去掉,这里有一个很好的解决方案。这真的很不划算。您不应该使用这段代码,其他答案都是更加地道的Ruby。实际执行任务的代码对判断答案的门槛很低;你应该用这种语言的风格写好代码。string.split/\w/.map{| word | word[0]}.join或其他版本的split/map/join`是用Ruby编写的,而不是通过创建累加器并添加到累加器上,当然也不是使用@variables,当您实际需要它们时,应该使用它们,而不是任意使用它们。或者,.map{| word word word[0]}可以替换为.map&:first。拆分参数也可以省略,如果$;未设置拆分将默认为空白。@3limin4t0r Stringfirst是ActiveSupport方法;不是香草红宝石。你说得对,但我更喜欢直截了当。
gets.gsub(/(?<=\S)\S+\s*/, "")
puts "Oh, happy   day".gsub(/ |(?<=\S)./, '')
  #=> "Ohd"