Ruby:如何获取字符串的第一个字符

Shp*_*ord 108 ruby string

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

最终我正在做的是取一个人的姓氏,只是创建一个初始名称.

所以如果字符串是"史密斯"我只想要"S".

ico*_*ast 123

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

class String
  def initial
    self[0,1]
  end
end
Run Code Online (Sandbox Code Playgroud)

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

last_name = "Smith"
first_name = "John"
Run Code Online (Sandbox Code Playgroud)

然后你可以非常干净和可读地得到首字母:

puts first_name.initial   # prints J
puts last_name.initial    # prints S
Run Code Online (Sandbox Code Playgroud)

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

puts 'Smith'[0]           # prints 83
Run Code Online (Sandbox Code Playgroud)

当然,如果您没有定期执行此操作,那么定义该方法可能会过度,您可以直接执行此操作:

puts last_name[0,1] 
Run Code Online (Sandbox Code Playgroud)


Jör*_*tag 97

如果您使用最新版本的Ruby(1.9.0或更高版本),则以下内容应该有效:

'Smith'[0] # => 'S'
Run Code Online (Sandbox Code Playgroud)

如果您使用1.9.0+或1.8.7,则以下内容应该有效:

'Smith'.chars.first # => 'S'
Run Code Online (Sandbox Code Playgroud)

如果您使用的是早于1.8.7的版本,则应该可以使用:

'Smith'.split(//).first # => 'S'
Run Code Online (Sandbox Code Playgroud)

请注意,'Smith'[0,1]没有在1.8的工作,它会不会给你的第一个字符,它只会给你的第一个字节.

  • Ruby 1.8不是遗产!仍然支持Ruby 1.8系列,很可能会发布1.8.8版本.而且,JRuby和Rubinius都不支持1.9.我敢打赌5美元今天有更多用户1.8比1.9. (4认同)
  • @Jörg:答案"史密斯"[0,1]`确实在1.8上工作(假设是ASCII).不确定为什么你对请求者以及想要从这个问题中学习的其他人做出如此多的假设.例如,Mac OS X捆绑了Ruby 1.8,因此这些用户无需安装. (3认同)
  • 您如何获得名称'Ångström'(UTF-8)的首字母,以便它在Ruby 1.8.x和1.9.x中都能正常工作?两种建议的方法都不适用于1.8.x. (3认同)

And*_*imm 29

"Smith"[0..0]
Run Code Online (Sandbox Code Playgroud)

适用于ruby 1.8和ruby 1.9.


Bra*_*don 21

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

"Smith".chr    #=> "S"
Run Code Online (Sandbox Code Playgroud)

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


Way*_*rad 14

在MRI 1.8.7或更高版本中:

'foobarbaz'.each_char.first
Run Code Online (Sandbox Code Playgroud)


Sug*_*nya 11

在Rails中

name = 'Smith'
name.first 
Run Code Online (Sandbox Code Playgroud)


Gag*_*ami 8

试试这个:

>> a = "Smith"
>> a[0]
=> "S"
Run Code Online (Sandbox Code Playgroud)

要么

>> "Smith".chr
#=> "S"
Run Code Online (Sandbox Code Playgroud)


Sil*_*ost 5

>> s = 'Smith'                                                          
=> "Smith"                                                              
>> s[0]                                                                 
=> "S"                                                        
Run Code Online (Sandbox Code Playgroud)


jef*_*ll2 5

尚未提及的另一个选项:

> "Smith".slice(0)
#=> "S"
Run Code Online (Sandbox Code Playgroud)