Ruby : 문자열의 첫 번째 문자를 얻는 방법


113

Ruby를 사용하여 문자열의 첫 번째 문자를 얻으려면 어떻게해야합니까?

궁극적으로 내가하는 일은 누군가의 성을 가져 와서 이니셜을 만드는 것입니다.

따라서 문자열이 "Smith"이면 "S"만 원합니다.


10
참고로 Rails에 있다면 그냥 할 수 있습니다'Smith'.first
Walking Wiki

루비 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".
rampion

@rampion : 물론입니다.하지만 OP가 최신 버전을 사용하지 않는다는 표시가 없습니다. 왜 복잡한 일을해야합니까?
Jörg W Mittag

4
루비 1.8은 레거시가 아닙니다! Ruby 1.8 라인은 여전히 ​​지원되며 1.8.8 버전이 출시 될 가능성이 높습니다. 또한 JRuby와 Rubinius는 아직 1.9를 지원하지 않습니다. 나는 오늘날 1.9보다 1.8의 사용자가 훨씬 더 많다는 데 5 $를 걸 것이다.
Marc-André Lafortune

3
@ Jörg : 대답 "Smith"[0,1]은 1.8에서 작동합니다 (ASCII 가정). 요청자뿐만 아니라 그 질문에서 배우고 싶은 다른 모든 사람들에 대해 왜 그렇게 많이 가정하는지 확실하지 않습니다. 예를 들어, Mac OS X에는 Ruby 1.8이 번들로 제공되므로 이러한 사용자는 설치할 필요가 없습니다.
Marc-André Lafortune

3
Ruby 1.8.x와 1.9.x 모두에서 예상대로 작동하도록 'Ångström'(UTF-8) 이름의 이니셜을 어떻게 얻습니까? 제안 된 방법 중 어느 것도 1.8.x에서 작동하지 않습니다.
Lars Haugseth




12

레일스에서

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모두 루비 1.8 및 1.9에 대한 사실입니다
마크 - 앙드레 Lafortune

2

루비 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

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. 그리고 마지막 하나는 당신이를 제거 할 경우에도 비 sensical입니다 .-이 같은 일을 두 가지 방법을 사용하고 있기 때문에, [0] 하고 chr() .
jeffdill2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.