Ruby - 在数组元素中打印字符串的第一部分
Ruby - print first part of string in element of array
给定一个字符串数组(全名),我只需要打印名字(提示 - 我需要使用迭代和数组方法)
搜索字词:"ruby print part of element in array"、"ruby array split strings"、"ruby each array .first"、"ruby print element array parameters"。
我测试了很多不同的堆栈溢出解决方案,我试过 ruby 文档和其他一些数组教程,但找不到我想做的事情。我觉得我想太多了,但我无法克服这个问题。
类似的工作代码:
full_names = ["Alice Smith", "Bob Evans", "Roy Rogers"]
puts "exercise #4 - print names by line"
full_names.each do |name|
puts name
end
损坏的代码 - 上次尝试的代码:
puts "exercise #4 - print only first"
full_names = ["Alice Smith", "Bob Evans", "Roy Rogers"]
full_names.each do |name|
puts name.first
end
Error ex_a.rb:78:in block in <main>': undefined method
first' for "Alice Smith":String (NoMethodError)
(line 78 is 'puts name.first')
如此接近:
puts "exercise #4 - print only first"
full_names = ["Alice Smith", "Bob Evans", "Roy Rogers"]
full_names.each do |name|
puts name.split.first
end
这与 steenslag 的回答基本相同,但您也可以像这样在一行中完成:
puts "exercise #4 - print only first"
full_names = ["Alice Smith", "Bob Evans", "Roy Rogers"]
full_names.each { |name| puts name.split.first }
或
full_names.each { |name| puts name.split[0] }
您收到错误 undefined method: first
的原因是 first
是 Enumerable 和数组 class 的一种方法。
参见 https://rubyapi.org/2.7/o/array#method-i-first
在 split
字符串(在本例中,名称由 space 分隔)之后,您将每个字符串单独变成一个数组。所以"Alice Smith".split => ["Alice", "Smith"]
。然后,您可以使用 first
或 [0]
访问此数组的第一项,这会访问任何数组的第一个索引。
同样,当您将 [0] 应用于字符串时,例如"Alice"[0]
,这是访问"Alice"
第一项的String#slice
方法。
因此,"Alice"[0] => "A"
参见:https://rubyapi.org/2.7/o/s?q=slice
虽然差别不大,但我会避免 split
而更喜欢以下方法:
puts name[/\S+/] # first word anywhere in the string
或
puts name[/^\S+/] # word must be at the start of the string
如果有一天您执行相同的想法从长文本中提取第一个单词,那么这种差异可能很重要。使用 split
,将扫描整个字符串并创建一个包含所有单词的临时数组,但您只需要第一个。使用我的方法,将只扫描字符串直到识别出第一个单词。
我的两个变体之间的区别在于,即使有前导空格,第二个变体也会提取名字,例如 " Alice Smith"
。另外,这种方法可以很容易地扩展到包括标点字符作为单词分隔符。
给定一个字符串数组(全名),我只需要打印名字(提示 - 我需要使用迭代和数组方法)
搜索字词:"ruby print part of element in array"、"ruby array split strings"、"ruby each array .first"、"ruby print element array parameters"。
我测试了很多不同的堆栈溢出解决方案,我试过 ruby 文档和其他一些数组教程,但找不到我想做的事情。我觉得我想太多了,但我无法克服这个问题。
类似的工作代码:
full_names = ["Alice Smith", "Bob Evans", "Roy Rogers"]
puts "exercise #4 - print names by line"
full_names.each do |name|
puts name
end
损坏的代码 - 上次尝试的代码:
puts "exercise #4 - print only first"
full_names = ["Alice Smith", "Bob Evans", "Roy Rogers"]
full_names.each do |name|
puts name.first
end
Error ex_a.rb:78:in
block in <main>': undefined method
first' for "Alice Smith":String (NoMethodError) (line 78 is 'puts name.first')
如此接近:
puts "exercise #4 - print only first"
full_names = ["Alice Smith", "Bob Evans", "Roy Rogers"]
full_names.each do |name|
puts name.split.first
end
这与 steenslag 的回答基本相同,但您也可以像这样在一行中完成:
puts "exercise #4 - print only first"
full_names = ["Alice Smith", "Bob Evans", "Roy Rogers"]
full_names.each { |name| puts name.split.first }
或
full_names.each { |name| puts name.split[0] }
您收到错误 undefined method: first
的原因是 first
是 Enumerable 和数组 class 的一种方法。
参见 https://rubyapi.org/2.7/o/array#method-i-first
在 split
字符串(在本例中,名称由 space 分隔)之后,您将每个字符串单独变成一个数组。所以"Alice Smith".split => ["Alice", "Smith"]
。然后,您可以使用 first
或 [0]
访问此数组的第一项,这会访问任何数组的第一个索引。
同样,当您将 [0] 应用于字符串时,例如"Alice"[0]
,这是访问"Alice"
第一项的String#slice
方法。
因此,"Alice"[0] => "A"
参见:https://rubyapi.org/2.7/o/s?q=slice
虽然差别不大,但我会避免 split
而更喜欢以下方法:
puts name[/\S+/] # first word anywhere in the string
或
puts name[/^\S+/] # word must be at the start of the string
如果有一天您执行相同的想法从长文本中提取第一个单词,那么这种差异可能很重要。使用 split
,将扫描整个字符串并创建一个包含所有单词的临时数组,但您只需要第一个。使用我的方法,将只扫描字符串直到识别出第一个单词。
我的两个变体之间的区别在于,即使有前导空格,第二个变体也会提取名字,例如 " Alice Smith"
。另外,这种方法可以很容易地扩展到包括标点字符作为单词分隔符。