【问题标题】:Iterating over an array and searching the matching element with a given string in ruby遍历数组并在 ruby​​ 中使用给定字符串搜索匹配元素
【发布时间】:2017-12-16 07:33:10
【问题描述】:

如果我有一个像

这样的数组
names = ["John", "Sam", "Sandy", "Andrew", "Charlie"]

我必须编写一个将数组作为参数的方法。在该方法中,使用 each 方法迭代数组。如果名称以“S”开头,则输出一条消息。

我该怎么做呢?到目前为止我只有

names.each do |i|
   puts i
end

【问题讨论】:

  • 您是否只对以"S" 开头的单词感兴趣?也就是说,你会用不以"S"开头的单词做任何事情吗?

标签: ruby-on-rails arrays ruby loops each


【解决方案1】:

Ruby 的方法是先使用select 和一个块或grep 和一个正则表达式来过滤以“S”开头的名称,然后才使用each 来显示选定的名称:

names = ["John", "Sam", "Sandy", "Andrew", "Charlie"]

s_names = names.grep(/^s/i)
# or
s_names = names.select{ |name| name.downcase.start_with?('s') }

s_names.each do |name|
  puts "'#{name}' starts with an 'S'"
end
# 'Sam' starts with an 'S'
# 'Sandy' starts with an 'S'

【讨论】:

    【解决方案2】:

    Ruby 1.9.2 引入了start_with?,它接收一个字符串作为参数并检查它是否存在于另一个字符串中。

    在你的情况下,你可以这样做。

    names.each do |name|
      puts 'output a message' if name.start_with?('S')
    end
    

    但对于更真实的生活场景,您应该做两件事。

    1. 名称也可以以 's' 而不是 'S' 开头,因此请同时搜索。
    2. 实际名称前可以有空格。使用.strip方法尾随空格,然后搜索。

    所以你应该像这样搜索更实际的场景。

    names = ["John", "sam", " Sandy", "Andrew", "Charlie"]
    
    names.each do |name|
      puts 'output a message' if name.strip.start_with?('s', 'S')
    end
    

    【讨论】:

      【解决方案3】:

      你可以试试start_with?:

      names = ["John", "Sam", "Sandy", "Andrew", "Charlie"]
      
      names.each do |name|
        puts 'output a message' if name.start_with?('S')
      end
      # output a message (for Sam)
      # output a message (for Sandy)
      

      【讨论】:

        猜你喜欢
        • 2021-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 2013-01-27
        • 1970-01-01
        • 2012-01-13
        • 1970-01-01
        相关资源
        最近更新 更多