Ruby:文字列の最初の文字を取得する方法


113

Rubyを使用して文字列の最初の文字を取得するにはどうすればよいですか?

最終的に私がしていることは、誰かの姓を取って、それからイニシャルを作成することです。

文字列が "Smith"の場合、 "S"が必要です。


10
あなたがRailsの中にある場合、注意点として、あなただけ行うことができます'Smith'.first
ウィキウォーキング

ルビー1.9+はあり"Smith".chr #=> "S"
タイラージェームス・ヤング

回答:


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"ます。
ランピオン2010

@rampion:もちろんですが、OPが最新のバージョンを使用していないという質問には何も示されていません。
イェルクWミッターク

4
Ruby 1.8はレガシーではありません!Ruby 1.8ラインは引き続きサポートされており、おそらく1.8.8バージョンがリリースされます。さらに、JRubyもRubiniusもまだ1.9をサポートしていません。今日、1.9より1.8のユーザーの方がはるかに多いことは、5ドルだと思います。
マルク=アンドレ・Lafortune

3
@ヨルク:答え"Smith"[0,1]は1.8で動作します(ASCIIを想定)。なぜリクエスタについてだけでなく、その質問から学びたいと思っている他のすべての人についても多くを想定しているのかわかりません。たとえば、Mac OS XにはRuby 1.8がバンドルされているため、これらのユーザーはインストールする必要はありません。
マルク=アンドレ・Lafortune

3
Rubyの1.8.xと1.9.xの両方で期待どおりに機能するように、「Ångström」(UTF-8)の名前のイニシャルをどのように取得しますか?1.8.xでは、提案された方法はどちらも機能しません。
Lars Haugseth、2010

30
"Smith"[0..0]

ruby 1.8とruby 1.9の両方で動作します。


1
1.8.6および1.9のサポートが必要な場合、これが最良のソリューションです。
計画






2

Ruby 1.9より前の迷惑なデザインの選択により、最初の文字の文字コードsome_string[0]返されます。これを記述する最も移植性の高い方法は、インデックス0で1文字の長さの部分文字列を取得するように指示することです。some_string[0,1]


str [0,1]も1.8と1.9では同じようには機能しません。前者では最初のバイトを返し、後者では最初の文字を返します。
Lars Haugseth、2010

1
これは、1.9がマルチバイト言語をサポートしているのと同じように、インデックス作成の動作にそれほど違いはありません。どちらも最初の文字を返すことを目的としていますが、1.8には「文字」が何であるかについてより単純な見方があります。
チャック

2

まだ言及されていない別のオプション:

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

0

あなたも使うことができます truncate

> 'Smith'.truncate(1, omission: '')
#=> "S"

または追加のフォーマット:

> 'Smith'.truncate(4)
#=> "S..."

> 'Smith'.truncate(2, omission: '.')
#=> "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。また、最後のものは、を削除しても意味があり.ません。これは、同じことを行うために2つの異なる方法を使用しているためです- [0] および chr()
jeffdill2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.