LoginSignup
25
25

More than 5 years have passed since last update.

Rubyの正規表現リテラルは左辺においたほうがいいんじゃないの? って話

Last updated at Posted at 2013-11-27

なんで?

正規表現で使われる=~の実態はRegexp#=~なんですが、この時 右辺に使えるのはStringだけ です。
ついでに、String#=~Regexp#=~のシンタックスシュガーで、これによって辺を交換しても動作します。
(参照: http://osdir.com/ml/lang.ruby.japanese/2007-05/msg00058.html

世間(というか自分の周り)では、"Hello" =~ /e/と書くほうが圧倒的に多く、
それどころか/e/ =~ "Hello"と書けるのかどうか自信ない、なんて人もいました。

ところで、Object#=~があるのもあって、一応5 =~ /5/なんて書くこともできます。 結果はnilです。
これは"5" =~ /5/あるいは5.to_s =~ /5/と書けば意図通りです。
もちろん/5/ =~ 5とは 書けません。前述のとおり、Regexp#=~Stringしか受け付けないので。

でもこれ、危険ですよね? to_sし忘れたらエラー出ない上に意図通り動かないんですよ?
自分は危険だと思います。ていうかこれでちょっとハマりました。

だから

意図通り動かないならいっそ動きを止めちゃってもいいと思うの私。
動きを止めるか止めないかの違いなだけで、意図通りでないことは間違いないわけですし。
このあたりはポリシーの違いかもしれませんね。

人(プロジェクト)によっては、とりあえず例外吐くことだけは避ける方針のこともあるでしょう。
Javaでリテラルを左辺に書くのは、NullPointerExceptionを避けるためでもありますしね。
# Nullチェックをしなくてもいい、なんて理由ももちろんありますが。

でも、繰り返しになりますけど、意図通りに動かないなら動きを止めようが止めまいがバグには違いないわけで。
だったら察知しやすいほうが断然いいと思うんです。

なので

コーディングルールで決まってない限りは正規表現リテラルを左辺に使うようにしたいなあ、なんて思います。

思うのですが、それともリテラルを右辺に置く実装上の理由があるのでしょうか?
このあたりを周りに聞いても「そういう慣習だから」とかそんな風にしか言われず、なんだかもやもやしてます。

追記

コメントや他もろもろで、「左辺にリテラル置くくらいならRegexp#match使えば?」と指摘もらいました。その通りですorz

追記その2

/5/ =~ 5と書くぐらいなら/5/.match(5)と書いたほうがいい、と確かに思いました。
# ワンラインで書いたことに大した意味はないです。
これだと、「メソッドの呼び出し」以上の印象を与えないので、コメントで指摘もらったような「気持ち悪さ」はあまり感じないように思います。

ただ、よくよく考えると、これって「左辺に書くか右辺に書くか」とはあんまり関係ない話なんですよね。

自分の主張は「右辺に書くと察知できないバグも左辺に書けば察知可能なんだから、左辺に書いたほうがよい」です。
どうあれ左辺に書くべきだ、までは思ってないのですけど、入力されるパラメータの型(と表現しておきます)が断定できないのであれば、より安全に、よりバグを察知しやすいように左辺に書くほうがいいのではないかな、と思います。

25
25
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
25