[#40298] Re: [ruby-cvs:33760] Ruby:r26545 (trunk): Wed Feb 3 10:12:09 2010 Aaron Patterson <tenderlove@ruby-lang.org> — "NARUSE, Yui" <naruse@...>

成瀬です。

29 messages 2010/02/03
[#40307] Re: [ruby-cvs:33760] Ruby:r26545 (trunk): Wed Feb 3 10:12:09 2010 Aaron Patterson <tenderlove@ruby-lang.org> — KOSAKI Motohiro <kosaki.motohiro@...> 2010/02/03

小崎です

[#40339] Re: [ruby-cvs:33760] Ruby:r26545 (trunk): Wed Feb 3 10:12:09 2010 Aaron Patterson <tenderlove@ruby-lang.org> — Tanaka Akira <akr@...> 2010/02/07

2010年2月3日21:07 KOSAKI Motohiro <kosaki.motohiro@gmail.com>:

[#40345] Re: [ruby-cvs:33760] Ruby:r26545 (trunk): Wed Feb 3 10:12:09 2010 Aaron Patterson <tenderlove@ruby-lang.org> — "NARUSE, Yui" <naruse@...> 2010/02/07

成瀬です。

[#40490] Re: [ruby-cvs:33760] Ruby:r26545 (trunk): Wed Feb 3 10:12:09 2010 Aaron Patterson <tenderlove@ruby-lang.org> — "NARUSE, Yui" <naruse@...> 2010/02/25

成瀬です。

[#40511] Re: [ruby-cvs:33760] Ruby:r26545 (trunk): Wed Feb 3 10:12:09 2010 Aaron Patterson <tenderlove@ruby-lang.org> — Aaron Patterson <aaron.patterson@...> 2010/02/27

2010/2/25 NARUSE, Yui <naruse@airemix.jp>:

[#40513] Re: [ruby-cvs:33760] Ruby:r26545 (trunk): Wed Feb 3 10:12:09 2010 Aaron Patterson <tenderlove@ruby-lang.org> — "U.Nakamura" <usa@...> 2010/02/27

アーロン宛

[#40317] [Bug:trunk] TCPServer#gets gets stuck — Yusuke ENDOH <mame@...>

遠藤です。

19 messages 2010/02/04
[#40371] Re: [Bug:trunk] TCPServer#gets gets stuck — Yusuke ENDOH <mame@...> 2010/02/09

遠藤です。

[#40382] [Bug:trunk] rubyspec: ObjectSpace.define_finalizer doesn't call self-referencing finalizers FAILED — Yusuke ENDOH <mame@...>

なかださんかまつもとさん

9 messages 2010/02/10

[#40418] [Feature #2746] ビルドする拡張ライブラリを configure 時に指定するための --with-exts オプション — Kenta Murata <redmine@...>

Feature #2746: ビルドする拡張ライブラリを configure 時に指定するための --with-exts オプション

11 messages 2010/02/15

[#40461] respond_to?(<protected method name>) returns true — "Akinori MUSHA" <knu@...>

 今さらかもしれませんが、 respond_to? で protected メソッドを

14 messages 2010/02/22
[#40462] Re: respond_to?(<protected method name>) returns true — Yukihiro Matsumoto <matz@...> 2010/02/23

まつもと ゆきひろです

[#40463] Re: respond_to?(<protected method name>) returns true — "Akinori MUSHA" <knu@...> 2010/02/23

At Tue, 23 Feb 2010 14:09:52 +0900,

[#40464] Re: respond_to?(<protected method name>) returns true — Yukihiro Matsumoto <matz@...> 2010/02/23

まつもと ゆきひろです

[#40467] Re: [ruby-cvs:33954] Ruby:r26739 (trunk): * ext/openssl/ossl_digest.c (GetDigestPtr): Allow to pass the — "NARUSE, Yui" <naruse@...>

成瀬です。

27 messages 2010/02/23
[#40468] Re: [ruby-cvs:33954] Ruby:r26739 (trunk): * ext/openssl/ossl_digest.c (GetDigestPtr): Allow to pass the — "Akinori MUSHA" <knu@...> 2010/02/23

At Wed, 24 Feb 2010 01:28:24 +0900,

[#40469] Re: [ruby-cvs:33954] Ruby:r26739 (trunk): * ext/openssl/ossl_digest.c (GetDigestPtr): Allow to pass the — "NARUSE, Yui" <naruse@...> 2010/02/23

(2010/02/24 1:57), Akinori MUSHA wrote:

[#40470] Re: [ruby-cvs:33954] Ruby:r26739 (trunk): * ext/openssl/ossl_digest.c (GetDigestPtr): Allow to pass the — "Akinori MUSHA" <knu@...> 2010/02/23

At Wed, 24 Feb 2010 02:07:00 +0900,

[#40472] Re: [ruby-cvs:33954] Ruby:r26739 (trunk): * ext/openssl/ossl_digest.c (GetDigestPtr): Allow to pass the — "NAKAMURA, Hiroshi" <nakahiro@...> 2010/02/23

2010/2/24 Akinori MUSHA <knu@idaemons.org>:

[#40473] Re: [ruby-cvs:33954] Ruby:r26739 (trunk): * ext/openssl/ossl_digest.c (GetDigestPtr): Allow to pass the — "Akinori MUSHA" <knu@...> 2010/02/23

At Wed, 24 Feb 2010 06:06:13 +0900,

[#40486] Re: [ruby-cvs:33954] Ruby:r26739 (trunk): * ext/openssl/ossl_digest.c (GetDigestPtr): Allow to pass the — "NAKAMURA, Hiroshi" <nakahiro@...> 2010/02/25

MjAxMC8yLzI0IEFraW5vcmkgTVVTSEEgPGtudUBpZGFlbW9ucy5vcmc+Ogo+PiAbJEIwRTlmPWhN

[#41367] Re: [ruby-cvs:33954] Ruby:r26739 (trunk): * ext/openssl/ossl_digest.c (GetDigestPtr): Allow to pass the — "NAKAMURA, Hiroshi" <nakahiro@...> 2010/05/20

2010/2/25 NAKAMURA, Hiroshi <nakahiro@gmail.com>:

[#41373] Re: [ruby-cvs:33954] Ruby:r26739 (trunk): * ext/openssl/ossl_digest.c (GetDigestPtr): Allow to pass the — "Akinori MUSHA" <knu@...> 2010/05/20

 長いことほとんど Ruby に時間が割けておらずすみません。

[#41518] Re: [ruby-cvs:33954] Ruby:r26739 (trunk): * ext/openssl/ossl_digest.c (GetDigestPtr): Allow to pass the — "NAKAMURA, Hiroshi" <nakahiro@...> 2010/06/03

2010/5/20 Akinori MUSHA <knu@idaemons.org>:

[#41520] Re: [ruby-cvs:33954] Ruby:r26739 (trunk): * ext/openssl/ossl_digest.c (GetDigestPtr): Allow to pass the — "NARUSE, Yui" <naruse@...> 2010/06/03

成瀬です。

[#40492] [Bug #2794] Aborted (core dumped) BUG on Ruby/DL — Takao NISHI <redmine@...>

Bug #2794: Aborted (core dumped) BUG on Ruby/DL

10 messages 2010/02/26

[ruby-dev:40463] Re: respond_to?(<protected method name>) returns true

From: "Akinori MUSHA" <knu@...>
Date: 2010-02-23 14:46:51 UTC
List: ruby-dev #40463
At Tue, 23 Feb 2010 14:09:52 +0900,
matz wrote:
> In message "Re: [ruby-dev:40461] respond_to?(<protected method name>) returns true"
>     on Mon, 22 Feb 2010 23:49:37 +0900, "Akinori MUSHA" <knu@iDaemons.org> writes:
>
> | 今さらかもしれませんが、 respond_to? で protected メソッドを
> |検査すると真になるのってそういうものでしたっけ。
>
> protectedメソッドはレシーバによって呼べるか呼べないか決まるの
> で、レシーバ情報を(通常の方法では)持たない respond_to? では
> 「呼べるかもしれない」として真を返しています。

 考えるに、 respond_to? で調べた上で、 protected であってもなお
呼びたいということはまれではないでしょうか。protected メソッドは
その存在を知識として共有する相互関係において呼ばれるものであり、
同族判定は必要なら通常 duck type test に先だって行いますから、
respond_to? は protected メソッドを呼べるかもしれないとして気に
する必要はないように思えます。

> | respond_to? を使う目的を考えると釈然としないのですが、この
> |挙動は意図的でしょうか。
>
> そういう意味では意図的です。深く考察したわけではありませんが。
>
> 呼べる時だけにrespond_to?は真を返すべきである、と考えると、コー
> ルフレームを走査して、レシーバ情報を取り出す必要があります。
> とすると、send経由で呼び出された時にはどうするか、など考える
> とどんどん複雑化しそうです。
>
> しかし、今、改めて考えると、method_missingで実現されるメソッ
> ドでは、呼び出すことができても respond_to? は偽を返すわけです
> から、これは「呼べないかもしれないものは偽」というルールであ
> ると見なすことができます。ここからの類推からいえば protected
> なメソッドに対するrespond_to? は偽を返すべきなのかもしれませ
> ん。
>
> どうしましょう?

 もう一つ、 instance コンテキストで private メソッドについて
respond_to? を呼んでも偽になります。

class X
  def foo
    p :foo
  end
  private :foo

  def bar
    # 事前に調べると偽
    p respond_to?(:foo)

    # でも呼べる
    foo
  end
end

X.new.bar

 このように respond_to? では、呼べるかどうかの検査という視点に
おいて偽陽性と偽陰性がともに生じています。NoMethodError は気軽に
rescue すべき例外ではなく(呼んだメソッドの先のバグも拾ってしまう)、
それを避けるための respond_to? ですから、少なくとも呼ぶこと自体は
エラーにならないときのみ真を返すようにし、偽陽性を排除した方がいい
のではないかと考えます。


 ところで、この問題に気づいたのは OpenStruct をいじっていたときの
ことです。同クラスには table という名前の protected メソッドがある
にも関わらず、同じ名前のプロパティを使っても誤動作しなかったのです。

 そのからくりはこうでした。未知のプロパティにアクセスされると、
method_missing は必要に応じて getter/setter を定義するのですが、
その「必要性」の検査は respond_to? で行っています。ここでたまたま
respond_to?(:table) が真になるため、 obj.table = 1 としても getter
メソッド table は(再)定義されません。従ってサブクラス等で protected
メソッド table を使っていても問題ありません。一方、 obj.table と
値を取得しようとするときは protected メソッドの呼び出しは無効なので
method_missing にルートされ、見事に値を得ることができるわけです。

 本当は偶然ではないのかもしれませんが、特殊な例であることは確か
なので、 method(key).owner から判定するような作りに直すことはでき
ます(すでに手元にあります)。

 respond_to? の仕様を変更するとこのような非互換性も生じますが、
呼べないものが真を返さなくなることは概して歓迎できるのではないかと
思います。何か見落としはあるでしょうか。

--
Akinori MUSHA / http://akinori.org/

In This Thread