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


113

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

最终,我正在做的就是使用某人的姓氏,并为其创建一个缩写。

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


10
附带一提,如果您在Rails中,您可以做'Smith'.first
Walking Wiki

Ruby 1.9+具有"Smith".chr #=> "S"
Tyler James Young,

Answers:


128

您可以使用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] 

101

如果您使用的是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]没有在1.8的工作,它会不会给你的第一个字符,它只会给你的第一个字节


1
请注意,这仅适用于ruby19。在ruby18 "Smith"[0]中将返回字符“ S”的整数值。两个版本都遵守"Smith"[0,1] == "S"

@rampion:可以,但是问题没有表明OP不使用最新版本,那么为什么要麻烦一些事情呢?
约尔格W¯¯米塔格

4
Ruby 1.8不是旧版!仍支持Ruby 1.8系列,并且很可能会发布1.8.8版本。而且,JRuby和Rubinius都不支持1.9。我敢打赌,5美元今天的1.8用户要多于1.9用户。
马克-安德烈·Lafortune

3
@Jörg:答案"Smith"[0,1]确实适用于1.8(假设ASCII)。不知道为什么您对请求者以及想从该问题中学习的其他人这么多承担。例如,Mac OS X与Ruby 1.8捆绑在一起,因此这些用户不需要安装。
马克-安德烈·Lafortune

3
您将如何获得名称“Ångström”的缩写(在UTF-8中),以使其在Ruby 1.8.x和1.9.x中都能正常使用?建议的方法均不能在1.8.x中使用。
Lars Haugseth





11

试试这个:

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

要么

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

5
>> s = 'Smith'                                                          
=> "Smith"                                                              
>> s[0]                                                                 
=> "S"                                                        

1
请注意,这仅适用于ruby19。在ruby18 "Smith"[0]中将返回字符“ S”的整数值。两种版本都遵守"Smith"[0,1] == "S"
猖ion

1
@rampion:的确如此。我想补充一点,"Smith"[0] == ?S就是双方的Ruby 1.8和1.9真
马克-安德烈·Lafortune

2

由于1.9之前的Ruby中令人讨厌的设计选择- some_string[0]返回第一个字符的字符代码 -编写此字符的最可移植的方式是some_string[0,1],它告诉它在索引0处得到一个长1个字符的子字符串。


str [0,1]在1.8和1.9中也不一样,因为前者返回第一个字节,而后者返回第一个字符
Lars Haugseth

1
索引的工作方式与1.9对多字节语言的支持一样,并没有太大的区别。它们都打算返回第一个字符,但是1.8对“字符”的含义更为幼稚。
Chuck

2

尚未提及的另一种选择:

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


-1

这些方法中的任何一种都可以使用:

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

1
没有这些方法将与工作.name。即使删除了.,最后一个也是毫无意义的,因为它使用两种不同的方法来完成相同的操作– [0] chr()
jeffdill2 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.