【问题标题】:Ruby: How to get the first character of a stringRuby:如何获取字符串的第一个字符
【发布时间】:2010-04-28 15:25:12
【问题描述】:

如何使用 Ruby 获取字符串中的第一个字符?

我所做的最终是取某人的姓氏并从中创建一个首字母。

所以如果字符串是“Smith”,我只想要“S”。

【问题讨论】:

  • 附带说明,如果你在 Rails 中,你可以这样做 'Smith'.first
  • Ruby 1.9+ 有"Smith".chr #=> "S"

标签: ruby string


【解决方案1】:

您可以使用 Ruby 的开放类使您的代码更具可读性。例如,这个:

class String
  def initial
    self[0,1]
  end
end

将允许您对任何字符串使用initial 方法。所以如果你有以下变量:

last_name = "Smith"
first_name = "John"

那么你就可以非常清晰易读地获得缩写:

puts first_name.initial   # prints J
puts last_name.initial    # prints S

这里提到的另一种方法在 Ruby 1.8 上不起作用(不是说你应该再使用 1.8 了!--但是当这个答案发布时它仍然很常见):

puts 'Smith'[0]           # prints 83

当然,如果你不是定期做,那么定义方法可能有点过头了,你可以直接做:

puts last_name[0,1] 

【讨论】:

    【解决方案2】:

    如果您使用的是最新版本的 Ruby(1.9.0 或更高版本),则应该可以使用以下方法:

    'Smith'[0] # => 'S'
    

    如果您使用 1.9.0+ 或 1.8.7,以下应该可以工作:

    'Smith'.chars.first # => 'S'
    

    如果您使用早于 1.8.7 的版本,这应该可以工作:

    'Smith'.split(//).first # => 'S'
    

    注意'Smith'[0,1] not 在 1.8 上工作,它不会 给你第一个字符,它只会给你第一个 byte em>。

    【讨论】:

    • 请注意,这只适用于 ruby​​19。在 ruby​​18 中,"Smith"[0] 将返回字符“S”的整数值。两个版本都服从"Smith"[0,1] == "S"。
    • @rampion:当然可以,但是问题中没有迹象表明 OP 不使用最新版本,所以为什么还要麻烦事情复杂化呢?
    • Ruby 1.8 不是传统的! Ruby 1.8 行仍然受支持,并且很可能会发布 1.8.8 版本。此外,JRuby 和 Rubinius 都不支持 1.9。我敢打赌,今天 1.8 的用户比 1.9 的用户多得多。
    • @Jörg:答案"Smith"[0,1] 确实适用于 1.8(假设为 ASCII)。不知道为什么您对请求者以及想从该问题中学习的其他所有人做出如此多的假设。例如,Mac OS X 与 Ruby 1.8 捆绑在一起,因此这些用户无需安装。
    • 如何获得名称“Ångström”的首字母(在 UTF-8 中),以便它在 Ruby 1.8.x 和 1.9.x 中都能按预期工作?建议的方法都不适用于 1.8.x。
    【解决方案3】:
    "Smith"[0..0]
    

    适用于 ruby​​ 1.8 和 ruby​​ 1.9。

    【讨论】:

    • 如果需要 1.8.6 和 1.9 支持,这是最好的解决方案。
    【解决方案4】:

    为了完整起见,因为 Ruby 1.9 String#chr 返回字符串的第一个字符。它在 2.0 和 2.1 中仍然可用。

    "Smith".chr    #=> "S"
    

    http://ruby-doc.org/core-1.9.3/String.html#method-i-chr

    【讨论】:

    • 这正是我一直在寻找的那种鬼鬼祟祟。与.first 不同,它不需要rails 来处理字符串。
    【解决方案5】:

    在 MRI 1.8.7 或更高版本中:

    'foobarbaz'.each_char.first
    

    【讨论】:

      【解决方案6】:

      试试这个:

      >> a = "Smith"
      >> a[0]
      => "S"
      

      或

      >> "Smith".chr
      #=> "S"
      

      【讨论】:

        【解决方案7】:

        在 Rails 中

        name = 'Smith'
        name.first 
        

        【讨论】:

        • 简单易用。感谢您的回答。
        【解决方案8】:
        >> s = 'Smith'                                                          
        => "Smith"                                                              
        >> s[0]                                                                 
        => "S"                                                        
        

        【讨论】:

        • 请注意,这只适用于 ruby​​19。在 ruby​​18 中,"Smith"[0] 将返回字符“S”的整数值。两个版本都服从"Smith"[0,1] == "S"。
        • @rampion:确实。我要补充一点,"Smith"[0] == ?S 在 Ruby 1.8 和 1.9 上都是正确的
        【解决方案9】:

        另一个尚未提及的选项:

        > "Smith".slice(0)
        #=> "S"
        

        【讨论】:

          【解决方案10】:

          由于 Ruby 1.9 之前的一个恼人的设计选择——some_string[0] 返回第一个字符的字符代码——最便携的写法是some_string[0,1],它告诉它得到索引 0 处的子字符串,长度为 1 个字符。

          【讨论】:

          • str[0,1] 在 1.8 和 1.9 中的工作方式也不相同,因为前者返回第一个 byte 而后者返回第一个字符.
          • 这在索引的工作方式上与 1.9 对多字节语言的支持并没有太大区别。它们都旨在返回第一个字符,但 1.8 对“字符”的含义更为天真。
          【解决方案11】:

          试试这个:

          def word(string, num)
              string = 'Smith'
              string[0..(num-1)]
          end
          

          【讨论】:

          • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。
          【解决方案12】:

          其他方法是使用chars 作为字符串:

          def abbrev_name
              first_name.chars.first.capitalize + '.' + ' ' + last_name
          end
          

          【讨论】:

            【解决方案13】:

            如果你使用Rails,你也可以使用truncate

            > 'Smith'.truncate(1, omission: '')
            #=> "S"
            

            或其他格式:

            > 'Smith'.truncate(4)
            #=> "S..."
            
            > 'Smith'.truncate(2, omission: '.')
            #=> "S."
            

            虽然这对于原始问题来说绝对是矫枉过正,但对于纯 ruby 解决方案,以下是 truncate 在 rails 中的实现方式

            # File activesupport/lib/active_support/core_ext/string/filters.rb, line 66
            def truncate(truncate_at, options = {})
              return dup unless length > truncate_at
            
              omission = options[:omission] || "..."
              length_with_room_for_omission = truncate_at - omission.length
              stop =        if options[:separator]
                  rindex(options[:separator], length_with_room_for_omission) || length_with_room_for_omission
                else
                  length_with_room_for_omission
                end
            
              "#{self[0, stop]}#{omission}"
            end
            

            【讨论】:

            • 截断仅在 Rails 中可用?
            • @MartinThurn 是的,很好。更新为 truncate 的 ruby​​ 实现
            【解决方案14】:

            以下任何一种方法都可以:

            name = 'Smith'
            puts name.[0..0] # => S
            puts name.[0] # => S
            puts name.[0,1] # => S
            puts name.[0].chr # => S
            

            【讨论】:

            • 没有一个在name之后可以使用.。最后一个即使你删除了.,也是毫无意义的,因为它使用两种不同的方法来做同样的事情——[0]和chr()。
            猜你喜欢
            • 2011-03-26
            • 2015-07-02
            • 1970-01-01
            • 2018-06-04
            • 1970-01-01
            • 2010-10-21
            • 2017-07-27
            相关资源
            最近更新 更多