From: "NARUSE, Yui" Date: 2010-01-30T04:47:34+09:00 Subject: [ruby-dev:40247] Re: [Feature #2366] private constant 成瀬です。 (2010/01/30 3:57), Masatoshi SEKI wrote: >> 元の提案 [ruby-dev:39685] に書きましたが、「非公開というのは承知の上で >> 敢えて使いたい」という要求を封じるものではありません。使うのに一手間 >> かかるようになるだけです。一手間かけることで、自分が自分の足を撃とうと >> していることを自覚してもらおうという狙いです。 > > うーん。そうするとそう宣言しなかったものは、どうなるんでしょう。 > > 「変えないって言ったのに変更しやがって!」と怒られるとか? 「変えない」と言った覚えはないわけですが、 公開APIである以上安易な仕様変更は慎む事が期待されます。 そもそも、Rails 以降 Ruby でも仕様変更は控えることが期待されつつあります。 >>> もしERBの実装が変わってしまってその書き換えをするコードが動かなくなって >>> しまうのは、仕様が変わった、と納得してもらっても良いような気がします。 >> >> 納得してくれる人はいいんですけどね。rubyspec の様子を見ると、そういう >> 牧歌的な期待は難しい気がしています。 > > えと、rubyspecというのはそういう変化をみつけてくれるセンサーのような > ものではなく、なにかを規定するものなんでしょうか。 "spec" ですし。 そもそも、RubySpec は誰のためのものかって、MRI のためじゃないんですよ。 JRuby や Rubinius、MacRuby、あと IronRuby のためのものです。 彼らが実装すべき「Ruby」の言語仕様を規定するのが RubySpec です。 > テストによって変化を見つけたら、変更したと宣言すればよいのではないの > ですか? > > rubyspecに書かれたものは、修正することができなくなるということでしょうか? RubySpec に書かれたもの——というか、書かれうる物は公開 API ですので、 それを修正する事は仕様変更、ひいては「Ruby」言語仕様の変更を意味し、 Ruby 互換実装を作っている人々全てに追従を要求することになります。 たとえ誰も使っていない API でも。 それでも仕様変更であると宣言するならばもちろん変更は可能です。 >> 普通に見えるものは何でも spec にされてしまう例として、以下のような spec >> があります。(private constant には関係ないですが……) >> >> http://github.com/rubyspec/rubyspec/blob/master/library/erb/src_spec.rb >> >> つまり、ERB#src の返り値を固定文字列で spec にしているという。1.9 で失敗 >> してるんですが、どう対処したものでしょう。 > > # そのセンスがいいかどうかはおいといて‥ センスの問題じゃないんですよ。 RubySpec の作り手達にって、彼らのユーザは悪名高き Rails なわけで、 ERB#src だろうがなんだろうが容赦なく使ってきます。 ですから、公開 API ならばテストするのは当然です。 > ERB#srcの結果の文字列に興味がある人にとっては、違うものを返してるの > だから、仕様変更しやがったんですよね。 MatzRuby は仕様変更の場合アプリケーション側に追従を要求する文化ですが、 現状互換実装は立場が弱いので。 > あるバージョンのERB#srcとまた別のバージョンのERB#srcの挙動は違うので > あれば、全てのバリエーションについて期待する結果を書かせてあげても > よいのではないですかねえ。 テストを書いて終わりじゃないという事は以上でご理解いただけた事かと思います。 -- NARUSE, Yui