2010-04-28 212 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" 
相關問題