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

122

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

我的最终目的是将某人的姓氏转换为首字母缩写。

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


11
顺便提一下,如果你在使用Rails,你可以直接使用'Smith'.first - Walking Wiki
1
Ruby 1.9+有"Smith".chr #=> "S" - Tyler James Young
14个回答

139

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

114

如果你使用的是较新的 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
4
Ruby 1.8不是遗留版本!Ruby 1.8线仍然得到支持,很可能会发布1.8.8版本。此外,JRuby和Rubinius都还不支持1.9。我敢打赌,现在使用1.8的用户比使用1.9的用户要多得多,5美元怎么样? - Marc-André Lafortune
3
@Jörg:答案 "Smith"[0,1] 在1.8版本上可以使用(假设使用ASCII编码)。不确定为什么您对请求者以及所有想从该问题中学习的人都做出了如此多的假设。例如,Mac OS X预装了Ruby 1.8,因此这些用户无需安装。 - Marc-André Lafortune
3
如何获取姓名 'Ångström' 的首字母(使用UTF-8),以便在Ruby 1.8.x和1.9.x中都能如预期般工作?建议的方法都不能在1.8.x版本中工作。 - Lars Haugseth
http://www.coderbyte.com/CodingArea/GuestEditor.php?ct=First%20Reverse&lan=Ruby <-- 必须使用 str[0,1] 来获取位置 0 上的字母(否则会得到位置 0 上字符的 ASCII 数字)。因此,这是使用早期版本的 Ruby。 - barlop
显示剩余4条评论

33
"Smith"[0..0]

在 Ruby 1.8 和 Ruby 1.9 中都能运行。


1
如果需要支持1.8.6和1.9版本,那么这是最佳解决方案。 - plang

28

1
这正是我正在寻找的那种诡计。与.first不同的是,它不需要Rails来处理字符串。 - omikes

14

试试这个:

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

或者

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

14

在MRI 1.8.7或更高版本中:

'foobarbaz'.each_char.first

12

在Rails中

name = 'Smith'
name.first 

易于使用。谢谢回答。 - AMIC MING

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

1
请注意,此代码仅适用于Ruby19。在Ruby18中,“Smith” [0]会返回字符“S”的整数值。两个版本都遵守“Smith” [0,1] ==“S”。 - rampion
1
@rampion:确实。 我要补充的是,“Smith”[0] == ?S 在 Ruby 1.8 和 1.9 上都是正确的。 - Marc-André Lafortune

5

还有一种选择还没有被提到:

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

2

由于 Ruby 1.9 之前的设计选择有点烦人 — some_string[0] 返回第一个字符的字符编码 — 最具可移植性的写法是 some_string[0,1],它告诉它获取索引为 0 的子字符串,长度为 1 个字符。


str[0,1]在1.8和1.9中的工作方式也不同,因为在前者中它返回第一个字节,而在后者中它返回第一个字符 - Lars Haugseth
1
这并不是索引工作方式的区别,而是1.9对多字节语言的支持。它们都旨在返回第一个字符,但1.8对“字符”的理解更为天真。 - Chuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接