새 문자열을 만들지 않고 Ruby에서 문자열을 자르는 표준 방법은 무엇입니까?


182

이것이 내가 지금 가지고있는 일입니다-그것이하는 일에 너무 장황하게 보입니다.

@title        = tokens[Title].strip! || tokens[Title] if !tokens[Title].nil?

토큰은 CSV 행을 분할하여 얻은 배열이라고 가정합니다. 이제 스트립과 같은 기능! !! et. 문자열이 수정되지 않은 경우 모두 nil을 반환합니다.

"abc".strip!    # => nil
" abc ".strip!  # => "abc"

루비가 사본을 만들지 않고 여분의 선행 또는 후행 공백을 포함하는 경우 트림 방법은 무엇입니까?

내가 원한다면 못 생겼어 tokens[Title].chomp!.strip!


3
토큰에서 물건을 반복해서 읽으려면 사전 처리하는 것이 더 합리적 일 수 있습니다. 즉, "tokens.each {| t | t.strip!}"입니다. "@title = tokens [Title] || ''"
glenn mcdonald

답변:


272

당신이 원하는 것은 다음과 같습니다.

@title = tokens[Title]
@title.strip!

#strip!메소드는nil 이 아무것도 제거하지 않은 경우, 그리고이 제거 된 경우 변수 자체.

Ruby 표준에 따르면 느낌표로 접미사가 붙은 방법으로 변수가 변경됩니다.

도움이 되었기를 바랍니다.

업데이트 : 이것은 다음 irb을 보여주기 위해 출력됩니다 .

>> @title = "abc"
=> "abc"
>> @title.strip!
=> nil
>> @title
=> "abc"
>> @title = " abc "
=> " abc "
>> @title.strip!
=> "abc"
>> @title
=> "abc"

1
흠 .. 아직도 @title = tokens [Title] .strip이라고 생각합니다! 깔끔하게 보입니다-수정되지 않은 문자열 대신 nil을 반환하는 것이 유감입니다. 누군가가 더 나은 답변을 게시하지 않으면 허용되는 비트를 얻게됩니다.
Gishu

7
@title = tokens [Title] .strip은 트릭을 수행하지만 대신 복사 할 것입니다. tokens [Title] 변수를 그대로 유지하면 좋습니다.
Igor

9
Ruby 1.9에는 tap이 있으며, 원하는대로 정확하게 수행합니다 : @ title.tap {| x | x.strip!}
timkay

2
@timkay 가능할까요 @title.tap &:strip!? 다른 것보다 깨끗해 보입니다.
Jon Egeland

16
왜 세상에서 nil무언가를 벗기지 않으면 돌아 올까요? 의심 할 여지없이 많은 사람들이 혼란스러워합니다.
Josh M.

53

Btw, 이제 루비는 이미 "!"없이 스트립 만 지원합니다.

비교:

p "abc".strip! == " abc ".strip!  # false, because "abc".strip! will return nil
p "abc".strip == " abc ".strip    # true

또한 strip복제본 이 없으면 불가능합니다 . string.c의 소스를 참조하십시오.

static VALUE
rb_str_strip(VALUE str)
{
    str = rb_str_dup(str);
    rb_str_strip_bang(str);
    return str;
}

루비 1.9.3p0 (2011-10-30) [i386-mingw32]

업데이트 1 : 지금 보듯이-1999 년에 만들어졌습니다 (참조 rev # 372 SVN의 ).

Update2 : strip!1.9.x, 2.x 및 트렁크 버전 모두에서 복제본을 만들지 않습니다.


1
"중복없이 벗기는 것은 불가능하다"-물론 가능하다 strip!.
Karoly Horvath

@KarolyHorvath는 C로 작성된 소스 코드를 보지 못합니까? Pls는주의 깊게 읽고, 중복에 관해 여기에 쓴 내용입니다.
gaRex

1
물론 나는 그것을 참조하십시오. 그러나의 소스 코드입니다 strip. 내가 뭔가를 이해하고 있습니까? "복제없이 스트리핑 할 수 없음"을 어떻게 해석 할 수 있습니까?
Karoly Horvath

@KarolyHorvath 내부 복제본은 항상 생성됩니다. 문자열`str = rb_str_dup (str);`에 관한 것입니다.
gaRex

1
그리고 복제본을 원하지 않으면 strip!aka 를 사용하십시오 rb_str_strip_bang.
Karoly Horvath

9

기본 레코드 구분 기호를 변경하지 않은 경우 스트립이 후행 캐리지 리턴을 제거하므로 스트립과 cho 프를 모두 사용할 필요가 없습니다.

Olly의 대답은 이미 Ruby에서 이것을 수행하는 정식 방법을 가지고 있지만, 스스로 많은 것을 발견하면 항상 방법을 정의 할 수 있습니다.

def strip_or_self!(str)
  str.strip! || str
end

기부:

@title = strip_or_self!(tokens[Title]) if tokens[Title]

또한 if 문은 @title토큰이 nil 인 경우 할당되지 않으므로 이전 값을 유지합니다. @title항상 할당 을 원하거나 신경 쓰지 않으려면 확인을 방법으로 옮기고 중복을 더 줄일 수 있습니다.

def strip_or_self!(str)
  str.strip! || str if str
end

대안으로 모험적이라고 생각되면 String 자체에 메소드를 정의 할 수 있습니다.

class String
  def strip_or_self!
    strip! || self
  end
end

다음 중 하나를 제공합니다.

@title = tokens[Title].strip_or_self! if tokens[Title]

@title = tokens[Title] && tokens[Title].strip_or_self!

9

Ruby on Rails를 사용하는 경우 스쿼시가 있습니다.

> @title = " abc "
 => " abc " 

> @title.squish
 => "abc"
> @title
 => " abc "

> @title.squish!
 => "abc"
> @title
 => "abc" 

Ruby 만 사용하는 경우 strip 을 사용하고 싶습니다.

당신의 경우에 당신은 강타없이 스트립을 사용하고 싶어!

스트립하는 동안! 액션이 없으면 확실히 nil을 반환하지만 여전히 변수를 업데이트하므로 strip! 인라인으로 사용할 수 없습니다. 스트립 인라인을 사용하려면 강타없이 버전을 사용할 수 있습니다!

조각! 멀티 라인 접근법 사용

> tokens["Title"] = " abc "
 => " abc "
> tokens["Title"].strip!
 => "abc"
> @title = tokens["Title"]
 => "abc"

스트립 한 줄 방법을 ... 당신의 대답을

> tokens["Title"] = " abc "
 => " abc "
> @title = tokens["Title"].strip if tokens["Title"].present?
 => "abc"

4

나는 당신의 예가 합리적인 접근법이라고 생각하지만, 당신은 그것을 약간 단순화 할 수 있습니다 :

@title = tokens[Title].strip! || tokens[Title] if tokens[Title]

대안은 두 줄에 넣을 수 있습니다.

@title = tokens[Title] || ''
@title.strip!

3

다음과 같이 필요한 후에 다른 방법을 사용하려는 경우 :

( str.strip || str ).split(',')

이 방법으로 스트립 후 여전히 무언가를 할 수 있습니다 :)



1

루비 1.9 또는 액티브 서포트가 있다면 간단하게 할 수 있습니다

@title = tokens[Title].try :tap, &:strip!

가 활용 이것은 정말 멋지다 :try과를:tap내 의견으로는 루비에서 가장 강력한 기능 구조 인 메소드를 .

기능을 기호로 전달하는 짝수 컷 형태 :

@title = tokens[Title].send :try, :tap, &:strip!

-1
@title = tokens[Title].strip! || tokens[Title]

주제를 이해하지 못하는 것이 전적으로 가능하지만 이것이 당신이 원하는 것을하지 않습니까?

" success ".strip! || "rescue" #=> "success"
"failure".strip! || "rescue" #=> "rescue"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.