0

一致がない場合は空の配列を返す String.scan 関数を使用する必要があります。

scan 関数で変数を割り当てて、一致があることを確認したかったのですが、一致しない場合は nil または false を返さないため、残念ながらそれはできません。

私はこれをやりたかった(1行):

if ip = str.scan(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)
  ...
  #use ip
end

しかし、一致しない場合は nil を返さないため、次のことを行う必要があります。

ip_match = str.scan(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)
unless ip_match.empty?
  #use ip
end

これを書くためのよりエレガントな方法はありますか?割り当てと空のチェックを同時に実行できるようにするか、コードを美しくする他の方法はありますか?

ありがとう

4

3 に答える 3

2

scan は配列を返すため、結果が 1 つしかないと確信している場合でも、これを行うことができます。

str.scan(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/).each do |ip|
  #use ip
end
于 2012-09-05T07:03:07.880 に答える
1

エレガントと不可解または「簡潔」には違いがあります。

Perl では、人々が次のようなものを書いているのをよく見かけます:

if (!(ip = str.scan(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)).empty?)

もう少し簡潔で、簡潔で、タイトで、何と呼んでも構いません。=また、 (equate) 対通常は等価テストであるべきもののために、メンテナンスの問題にもつながります。ロジックを理解していない人にコードが渡されると、誤ってそれを「修正」し、コードを壊してしまう可能性があります。

Ruby では、メンテナンスの問題から、条件付きテストで equate を使用せず、代入に続いてテストを使用するのが慣用的です。より明確なコードです。

個人的にはunless、そのような状況では使用しないことを好みます。unlessがより理解しやすいコードを生成するのに役立つかどうかは、進行中の議論です。私が好むif (!ip_match.empty?)のは、私たちが通常話しているように読めるからunlessです。会話中にステートメントを開始することはめったにありません。走行距離は異なる場合があります。

于 2012-09-05T07:09:18.380 に答える
1

私はできればStringヘルパーを使ってこのようなことをしたいと思いますmatch

ip_validator = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/

# match return nil if no match

if str.match ip_validator 
  # blah blah blah.....
end

コードをドライでクリーンに保つのを手伝ってください。これは最もエレガントではないかもしれません.もしあれば他の人を探しています:)

あなたの ip_validator 正規表現は週のようですRails 3: Validate IP String をチェックしてください

于 2012-09-05T07:34:23.277 に答える