# JavaScriptのwithをRubyでも使いたい夢をあきらめないで。
_published: 2010/04/20_ 
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でも使いたい夢を持っている人がいたら、ちょっと引きます。でも、あきらめないで。あなたの夢をあきらめないで。