61

Ruby には、ストリップ メソッドを呼び出して先頭と末尾の空白を削除する文字列があります。例えば

s = "12345 "
s.strip

ただし、文字列が nilの場合、次のエラーが発生します。

NoMethodError: undefined method `strip' for nil:NilClass

Ruby 1.9 を使用していますがnil、strip メソッドを呼び出す前に値を確認する最も簡単な方法は何ですか?

アップデート:

配列内の要素でこれを試しましたが、同じ問題が発生しました:

data[2][1][6].nil? ? data[2][1][6] : data[2][1][6].split(":")[1].strip
4

10 に答える 10

121

Ruby 2.3.0では、メソッドを呼び出す前に nil をチェックする安全なナビゲーション演算子( ) が追加されました。&.

s&.strip

の場合、この式はsを発生させる代わりに戻ります。nilnilNoMethodError

于 2016-01-06T05:22:28.840 に答える
17

tryActiveSupport (Rails ライブラリ) のメソッドを使用できます

gem install activesupport

require 'active_support/core_ext/object/try'
s.try(:strip)

または、追加の機能を提供する私の gem tryitを使用できます。

gem install tryit

s.try { strip }
于 2012-09-14T14:27:07.290 に答える
11

余分なオブジェクトが作成されても構わない場合は、次のいずれかが機能します。

"#{s}".strip
s.to_s.strip

余分なオブジェクトなし:

s && s.strip
s.strip if s
于 2012-09-14T16:39:21.020 に答える
9

以下の方法が一番簡単だと思います。

s.strip if s
于 2012-09-14T13:25:38.330 に答える
2

質問に表示されるエラーを回避したい場合:

s.to_s.strip
于 2012-09-14T15:35:07.730 に答える
2

私にとってうまくいく方法(自然のままのObject空間を汚染するべきではないことはわかっていますが、リスクを冒すほど便利です):

class Object
  def unless_nil(default = nil, &block)
    nil? ? default : block[self]
  end
end

p "123".unless_nil(&:length) #=> 3
p nil.unless_nil("-", &:length) #=> "-"

あなたの特定のケースでは、次のようになります。

data[2][1][6].unless_nil { |x| x.split(":")[1].unless_nil(&:strip) }

于 2012-09-14T14:17:52.710 に答える
2

ActiveSupportそのためのメソッドが付属しています: try. たとえば、nil の場合はan_object.try :strip戻りますが、それ以外の場合は続行します。構文は と同じです。active_support_core_extensions.html #try を参照してくださいnilan_objectsend

于 2012-09-14T14:29:14.597 に答える
0

簡単に言えば:

s = s.nil? ? s : s.strip

Tl;dr s が nil かどうかを確認してから s を返し、そうでない場合は削除します。

于 2012-09-14T13:25:21.160 に答える