web-dev-qa-db-ja.com

新しい文字列を作成せずにRubyの文字列をトリムする標準的な方法は何ですか?

これは私が今持っているものです-それはそれがしている仕事には冗長すぎます。

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

トークンは、CSV行を分割して取得した配列であると想定します。今ストリップのような機能!ムシャムシャ!など。文字列が変更されなかった場合、すべてnilを返します

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

コピーを作成せずに余分な先頭または末尾のスペースが含まれている場合、それをトリムするRubyの方法は何ですか?

tokens[Title].chomp!.strip!を実行したい場合はugい

173
Gishu

私はあなたが欲しいと思う:

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

ところで、今ではRubyは既に "!"なしのストリップをサポートしています。

比較:

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;
}

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

更新1:今見たように-1999年に作成されました(SVNの rev#372 を参照):

Update2:strip!は、1.9.x、2.x、およびトランクバージョンの両方で重複を作成しません。

50
gaRex

Stripは、後続のキャリッジリターンも削除するため、stripとchompの両方を使用する必要はありません-デフォルトのレコードセパレータを変更し、それがchompしている場合を除きます。

Ollyの答えにはすでにRubyでこれを行う標準的な方法がありますが、これを頻繁に行う場合は、常にメソッドを定義できます。

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

与える:

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

また、ifステートメントは、トークンがnilの場合に@titleが割り当てられないようにするため、前の値を保持することに注意してください。 @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!
8
user110564

RubyでRailsを使用している場合、squishがあります。

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

このような何かが必要になった後に別の方法を使用したい場合:

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

このようにして、ストリップした後でも何かを実行できます:)

あなたの例は賢明なアプローチだと思いますが、次のように少し単純化することもできます:

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

別の方法として、2行に配置することもできます。

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

私のやり方:

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

Ruby 1.9またはactivesupportをお持ちの場合は、簡単にできます

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

私の考えでは、これは:tryおよび:tapメソッドを活用しているため、Rubyで最も強力な機能的構成要素であるため、非常にクールです。

関数をシンボルとして完全に渡す、よりキュートなフォーム:

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