Hatena::ブログ(Diary)

わからん

2010.12.28

[][] 適切に多重代入したければ to_ary を定義しておく

多重代入したければ、右辺で使うオブジェクトのクラスで to_ary を定義しておくとそれが暗黙的に呼ばれる。

class Week
  def to_ary
    %w(monday tuesday wednesday thursday friday saturday sunday) 
      # => ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]
  end
end

mon, tue, wed, thu, *weekend = Week.new
mon                             # => "monday"
tue                             # => "tuesday"
wed                             # => "wednesday"
thu                             # => "thursday"
weekend                         # => ["friday", "saturday", "sunday"]

to_ary は、「オブジェクトを配列に変換してその配列を返します。オブジェクトの配列への暗黙の変換が必要なときに内部で呼ばれます。このメソッドが定義されたオブジェクトが単独で多重代入の右辺に現れた場合にも呼ばれます」とのこと。

[][] あるクラスが別のあるクラスのサブクラスであることを確認するには

class A
end

class B < A
end

という継承関係があるとき、B が A の子クラスであることをコードで確認するにはどうすればいいの、という問いの回答の一つに次のようなものがありました。


B < A      # => true

self < other で、「self が other の子孫である場合、 true を返します。 self が other の先祖か同一のクラス/モジュールである場合、false を返します。継承関係にないクラス同士の比較では nil を返します。」とのこと。Module#< なんてあるんですね。

[][] true か false をランダムに返すには

true か false をランダムに返すには、

[true,false].shuffle.shift      # => true

[true,false][rand(2)]           # => false

rand(2) == 1                    # => true

最後のが少し楽しかった。

[][] super と super()

Q: method_missing を使うときって、foo.non_existing_method() と引数なしの foo.non_existing_method は何か違うの?

A: いっしょだよ


という記事を読んで、super は()のありなしで意味が違うけどね、と勉強中の人らしい連想をした。

super は現在のメソッドがオーバーライドしているメソッドを呼び出します。括弧と引数が省略された場合には現在のメソッドの引数がそのまま引き渡されます。引数を渡さずにオーバーライドしたメソッドを呼び出すには super() と括弧を明示します。

それにしても月曜ですでに疲れた。

*1:Stack Overflow ネタは [SO] タグを付けることにしました。

Google