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

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

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

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

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

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

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



답변

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

@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"


답변

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 및 트렁크 버전 모두에서 복제본을 만들지 않습니다.


답변

기본 레코드 구분 기호를 변경하지 않은 경우 스트립이 후행 캐리지 리턴을 제거하므로 스트립과 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!


답변

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"


답변

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

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

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

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


답변

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

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

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


답변

내 길 :

> (@title = " abc ").strip!
 => "abc"
> @title
 => "abc"