programing

새로운 문자열을 만들지 않고 루비에서 문자열을 트리밍하는 표준 방법은 무엇입니까?

padding 2023. 7. 2. 19:05
반응형

새로운 문자열을 만들지 않고 루비에서 문자열을 트리밍하는 표준 방법은 무엇입니까?

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

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

토큰은 CSV 줄을 분할하여 얻은 배열이라고 가정합니다.이제 strip!chomp! 등과 같은 기능은 문자열이 수정되지 않은 경우 모두 0을 반환합니다.

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

복사본을 만들지 않고 추가로 선행 또는 후행 공백이 포함된 경우 트림을 말하는 루비 방법은 무엇입니까?

내가 하고 싶으면 더 못생겨집니다.tokens[Title].chomp!.strip!

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

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

메소드가 반환됩니다.nil아무것도 벗기지 않았다면, 그리고 변수 자체가 벗겨진 것이라면.

Ruby 표준에 따르면 느낌표가 붙은 방법은 제자리에서 변수를 변경합니다.

업데이트: 다음에서 출력됩니다.irb시연:

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

하지만, 이제 루비는 "!" 없이 그냥 스트립을 지원합니다.

비교:

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년에 만들어졌습니다(SVN의 Rev #372 참조).

업데이트 2:strip!에서는 1.9.x, 2.x 및 트렁크 버전 모두에서 중복 항목을 만들지 않습니다.

기본 레코드 구분 기호를 변경한 경우가 아니면 스트립과 쵸파스 스트립 모두 후행 캐리지 리턴을 제거할 필요가 없습니다.

올리의 대답은 이미 루비에서 이를 수행하는 표준적인 방법을 가지고 있지만, 만약 당신이 이것을 자주 하는 것을 발견한다면 당신은 항상 그것에 대한 방법을 정의할 수 있습니다.

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

주는 것:

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

또한 if 문이 다음을 방지한다는 것을 명심하십시오.@title토큰이 0인 경우 할당되지 않으므로 이전 값을 유지합니다.당신이 원하거나 괜찮다면요.@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" 

루비만 사용하는 경우 스트립을 사용할 수 있습니다.

여기에 갓챠가 있습니다.당신의 경우, 당신은 빵 없이 스트립을 사용하기를 원합니다!

strip! 작업이 없으면 확실히 0을 반환하므로 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"

다음과 같은 방법이 필요한 후 다른 방법을 사용하려면 다음을 수행합니다.

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

이런 식으로 당신은 옷을 벗고 나서 여전히 무언가를 할 수 있습니다 :)

다음과 같이 약간 단순화할 수는 있지만 귀하의 예는 현명한 접근 방식이라고 생각합니다.

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

또는 두 줄로 표시할 수 있습니다.

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

Ruby 1.9 또는 활성 지원이 있는 경우 간단히 수행할 수 있습니다.

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

이것은 정말 멋집니다, 왜냐하면 그것은 그것을 활용하기 때문입니다.:try 리고그고.:tap제 생각에 루비에서 가장 강력한 기능적 구조인 메소드입니다.

더 귀여운 형태의 전달은 기호로 함께 기능합니다.

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

내 방식:

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

제가 주제를 이해하지 못하는 것은 전적으로 가능하지만, 이것이 당신이 필요로 하는 것을 하지 않을까요?

" success ".strip! || "rescue" #=> "success"
"failure".strip! || "rescue" #=> "rescue"

언급URL : https://stackoverflow.com/questions/1000688/what-is-the-canonical-way-to-trim-a-string-in-ruby-without-creating-a-new-string

반응형