[#37021] [RAA] RAA/2.3 — "U.Nakamura" <usa@...>

みなさんこんにちは。

20 messages 2003/01/30

[ruby-list:36950] Re: Arrayの判定

From: UENO Katsuhiro <unnie@...>
Date: 2003-01-17 19:44:35 UTC
List: ruby-list #36950
うえのです。

On Sat, 18 Jan 2003 03:13:39 +0900
Masaaki Sakano <mas@star.le.ac.uk> wrote:

> 同じことですが、別解として、
>
>     if Array === word
>
> でもいいですね (word === Array は不可)。あるいは、
snip..
> ただ、、、Ruby の推奨は、Array というクラス名で直接判定ではなく、
> 必要なメソッド(の名前)があるかどうかで判断した方がよい、
> ということに(慣習として?)なっていたと理解しています。
> 例えば、Array クラスを継承した Arraynew クラスが将来できた
> (作った)として、その Arraynew クラスに対しても、(上の)スクリプトは
> 同じように動いて欲しい、というのが普通でしょうから。

Arraynew のインスタンスに対しても Array === word は true になります。

class Arraynew < Array
end
word = Arraynew.new
p word.is_a? Array    # => true
p Array === word      # => true

> どのメソッド名で判断するかは場合によるでしょうが、一般的には、Array なら
>
>     if defined? word.to_ary
>
> を使う、というのが、私の理解です。

to_ary というメソッドの存在は、そのオブジェクトが Array クラスの
インスタンスに暗黙に変換され得るということを表しているのであって、
そのアブジェクトが配列である (もしくは配列的性質を有している) という
ことを表しているのではないような気がします。

元々の例は Ruby の「配列」を Lisp のリストに変換するというのが
目的ですから、ここでは word.is_a? Array とするほうが素直では
ないでしょうか。


えと、私もよく分かっている方ではないですが、メソッドだろうとクラス
だろうと、このような判定をすること自体が Ruby では例外的なことです。
どちらの方法を取ったとしても例外的であることには変わりないのだから、
オブジェクトに求められる性質をより卒直に表現できる方を用いるのが
適切なのではないかと思います。

ただ、Ruby では、クラスよりもメソッドの有無のほうが、オブジェクトが
望まれる性質を有しているかどうかを判定するための情報として好ましい
局面が(圧倒的に)多いのは確かです。



 --  ----  -     - - -- -
うえの かつひろ@体温38℃ <unnie@blue.sky.or.jp>

In This Thread