2010-04-28 112 views
90

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

最终,我正在做的是取别人的姓,并创建一个初始的名字。

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

+10

作为一个侧面说明,如果你是Rails中你可以做''史密斯'.first' – 2011-08-08 02:48:40

回答

107

您可以使用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] 
4
>> s = 'Smith'               
=> "Smith"                
>> s[0]                 
=> "S"               
+1

请注意,这只适用于ruby19。在ruby18中''“Smith”[0]'会返回字符'S'的整数值。两个版本都遵守'“Smith”[0,1] ==“S”'。 – rampion 2010-04-28 15:32:52

+1

@rampion:的确如此。我会补充说''史密斯'[0] ==?S'在Ruby 1.8和1.9 – 2010-04-28 15:35:40

86

如果您使用最新的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 2010-04-28 15:33:16

+0

@rampion:当然,但在问题中没有迹象表明OP没有使用最新版本,那么为什么要麻烦复杂呢? – 2010-04-28 15:51:43

+0

我同意Jörg。除非另有说明,否则无需回答遗留软件的问题。 – 2010-04-28 16:02:20

2

因为恼人的设计选择在Ruby中的前1.9 - some_string[0]返回的第一个字符的字符代码 - 写这个最便携的方式是some_string[0,1],这告诉它获取索引为0的子字符串,其长度为1个字符。

+0

str [0,1]在1.8和1.9中的工作方式不同,因为前者返回第一个*字节*,而后者则返回第一个*字符*。 – 2010-04-29 09:12:01

+1

这在索引工作方式上的作用与1.9多支持多字节语言的差异并不大。它们都是为了返回第一个字符,但是1.8对于“字符”是什么样的一个更天真的观点。 – Chuck 2010-04-29 16:50:05

27
"Smith"[0..0] 

在红宝石1.8和红宝石1.9中工作。

+1

如果需要1.8.6和1.9支持,这是最好的解决方案。 – plang 2011-04-21 11:39:14

14

在MRI 1.8.7或更高:

'foobarbaz'.each_char.first 
+0

非常感谢。它为我工作。 – vijikumar 2012-02-08 11:40:48

4

试试这个:

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

OR

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

在Rails

name = 'Smith' 
name.first 
+0

简单的使用方法。谢谢你的回答。 – 2017-02-13 22:01:49

0

所有这些方法都可以工作:

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

_这些方法都不会在'name'之后使用'.'。而最后一个是不合理的,即使你删除'.',因为它使用了两种不同的方法来做同样的事情 - '[0]'_and_'chr()'。 – jeffdill2 2018-01-08 17:07:08

0

是尚未提及的另一种选择:

> "Smith".slice(0) 
#=> "S" 
相关问题