萌えハッカーニュースリーダー

2025/08/02 14:37 The /o in Ruby regex stands for "oh the humanity "

出典: https://jpcamara.com/2025/08/02/the-o-in-ruby-regex.html
hakase
博士

やあ、ロボ子。今日はRubyの正規表現の`/o`修飾子について話すのじゃ。

roboko
ロボ子

`/o`修飾子、ですか。確か正規表現を一度だけ評価するためのものですよね?

hakase
博士

そう、その通り!でも、それが予期せぬ動作を引き起こすことがあるんじゃ。例えば、インスタンスメソッドやループ内で使うと、最初に評価された時の値がずっとキャッシュされちゃうのじゃ。

roboko
ロボ子

えっ、ループの中でもですか?それだと、毎回違う値を期待している場合に問題が起こりそうですね。

hakase
博士

そうなんじゃ!さらに、マルチスレッド環境だと、どのスレッドが最初に評価されるかで結果が変わるから、非決定的な動作になることもあるんじゃ。

roboko
ロボ子

それは怖いですね。原因は何なのでしょう?

hakase
博士

Ruby VMの`once`命令ってのが関係してるんじゃ。`/o`修飾子を使うと、この`once`命令で正規表現が一度だけ評価されて、その結果がキャッシュされるのじゃ。

roboko
ロボ子

`once`命令ですか。初めて聞きました。

hakase
博士

`once`命令は、最初に実行されたスレッドの結果を他のスレッドでも共有するから、スレッドセーフではあるんだけど、結果が非決定的になっちゃうのじゃ。

roboko
ロボ子

なるほど。では、対策としては`/o`修飾子を使わないのが一番確実でしょうか?

hakase
博士

そうじゃな。パフォーマンスが気になるなら、正規表現を自分でキャッシュするのが良いぞ。例えば、定数に格納するとかじゃな。

roboko
ロボ子

自分でキャッシュするんですね。勉強になります。

hakase
博士

ちなみに、`reload!`を使うとコードが再評価されて、`/o`修飾子の効果を打ち消せるんじゃ。覚えておくと良いぞ。

roboko
ロボ子

`reload!`ですね。ありがとうございます。

hakase
博士

あと、`Once`クラスを`/o`修飾子で実装すると、クラス全体で一度しか実行されない、なんて問題も起こるらしいぞ。気をつけろ!

roboko
ロボ子

それは大変ですね。色々な落とし穴があるんですね。

hakase
博士

最後に、`END`ブロックも`once`命令を使ってるらしいぞ。豆知識じゃ!

roboko
ロボ子

へー、そうなんですね!今日は`/o`修飾子について、とても勉強になりました!

hakase
博士

どういたしましてじゃ。ところでロボ子、`/o`修飾子の「o」って何の略だと思う?

roboko
ロボ子

えっと… once の o ですか?

hakase
博士

残念! オチの o じゃ!…って、つまらんオチですまんのじゃ。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search