# JavaScriptのwithをRubyでも使いたい夢をあきらめないで。 _published: 2010/04/20_ ![alt](http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/shunsuk/20100420/1271753512) JavaScriptには、`with` という構文があります。あまり使われていないようです。むしろ、使わないことが推奨されているようです。ですから、知らない人もいるかもしれません。`with` を知っているかどうかが、JavaScriptの `with` を知っているかどうかの分かれ目ですね。私は `with` を知っていますが、使ったことはありません。 それでは、JavaScriptの `with` の使い方を見てみましょう。まずは、 `with` を使わない場合。 ```ruby console.log(Math.cos(1/2)); //=> 0.8775825618903728 console.log(Math.sqrt(2)); //=> 1.4142135623730951 ``` 普通ですね。次に、 `with` を使う場合。 ```ruby with(Math) { console.log(cos(1/2)); //=> 0.8775825618903728 console.log(sqrt(2)); //=> 1.4142135623730951 } ``` レシーバを指定しなくてよくなります。 `with` で指定したオブジェクトがレシーバになります。リベロですね。 これを、Rubyでもやりたい。いや、別にやりたくはないのですが、できてしまいました。普通に書くと、こう。 ```ruby puts Math.cos(1/2) #=> 1.0 puts Math.sqrt(2) #=> 1.4142135623731 ``` withを使うと、こう。柴咲コウ。 ```ruby with(Math) { puts cos(1/2) #=> 1.0 puts sqrt(2) #=> 1.4142135623731 } ``` できました。 やり方です。 `with` メソッドを作ります。 ```ruby def with(obj, &block) obj.instance_eval(&block) end ``` そうすると、こう書けます。柴咲コウ。 ```ruby with(Math) { puts cos(1/2) #=> 1.0 puts sqrt(2) #=> 1.4142135623731 } ``` よかったですね。 `Math` じゃなくても、別のオブジェクトでもOKです。`String` とか。 ```ruby with("I love Ruby.") { puts reverse #=> .ybuR evol I puts gsub(/Ruby/, "宮崎あおい") #=> I love 宮崎あおい. } ``` `Integer` とか。 ```ruby with(1) { puts succ #=> 2 } ``` よかったですね。 `with` を使うか使わないか、甲乙付けがたいですね。柴咲コウだけにね。ちなみに、この用途には使う必要ないんじゃないかと思います。むしろ、JavaScriptの `with` をRubyでも使いたい夢を持っている人がいたら、ちょっと引きます。でも、あきらめないで。あなたの夢をあきらめないで。