QA@IT
«質問へ戻る

質問を投稿

RubyのStruct.newがブロックを受け取るのは、なぜアンドキュメンテッド?

RubyのStruct.newがブロックを受け取るのは、なぜアンドキュメンテッド?

Point = Struct.new(:x, :y)
class Point
  def distance
    Math::sqrt(x**2 + y**2)
  end
end

というのは、

Point = Struct.new(:x, :y) do
  def distance
    Math::sqrt(x**2 + y**2)
  end
end

とも書けると最近気付きました。でも、Struct.newがブロックを受け取って、新たに生成されるクラス ( Point ) のコンテクストで module_eval されるという機能は公式(?)ドキュメントに書かれていません。

調べてみると、この機能は8年ぐらい前からCRubyにあるようですし、Rubiniusにも入っています。ドキュメントに書かれていない理由は何かあるのでしょうか?

  • 避けるべき理由はありますか?
  • ドキュメントにない機能はいつ消えてもおかしくないとか?
  • ふつうに使われてる?

「単に書かれていないだけ(書き忘れ)。他の機能と同様に別に使っても無問題」というなら、それでいいのですが、そういうこともあるものなのかなと疑問に思いました。

RubyのStruct.newがブロックを受け取るのは、なぜアンドキュメンテッド?

```ruby
Point = Struct.new(:x, :y)
class Point
  def distance
    Math::sqrt(x**2 + y**2)
  end
end
```

というのは、

```ruby
Point = Struct.new(:x, :y) do
  def distance
    Math::sqrt(x**2 + y**2)
  end
end
```

とも書けると最近気付きました。でも、Struct.newがブロックを受け取って、新たに生成されるクラス ( Point ) のコンテクストで module_eval されるという機能は公式(?)ドキュメントに書かれていません。

- http://ruby-doc.org/core-1.9.3/Struct.html#method-c-new
- http://ruby-doc.org/core-2.0/Struct.html#method-c-new

調べてみると、この機能は8年ぐらい前からCRubyにあるようですし、Rubiniusにも入っています。ドキュメントに書かれていない理由は何かあるのでしょうか?

- 避けるべき理由はありますか?
- ドキュメントにない機能はいつ消えてもおかしくないとか?
- ふつうに使われてる?

「単に書かれていないだけ(書き忘れ)。他の機能と同様に別に使っても無問題」というなら、それでいいのですが、そういうこともあるものなのかなと疑問に思いました。