Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

なんで?

正規表現で使われる=~の実態は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)と書いたほうがいい、と確かに思いました。
# ワンラインで書いたことに大した意味はないです。
これだと、「メソッドの呼び出し」以上の印象を与えないので、コメントで指摘もらったような「気持ち悪さ」はあまり感じないように思います。

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

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

A-gen
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした