# 過去の遺物

以下に挙げる変数名、メソッド名、オブジェクト名は古い名前です。 使用すると、警告が出たり、ある日突然なくなったりするかもしれません。

## 過去のメソッド

String#~
String#=~

  ~str は、1.8 以降削除されました。また、str =~ str は例外が出るように なりました。

Object#id

  1.8 では警告されます。代わりに Object#object_id を使ってください。

      $ ruby-1.8.0 -we 'p Object.new.id'
      -e:1: warning: Object#id will be deprecated; use Object#object_id
      537752050

Object#type

  1.8 では警告されます。代わりに Object#class を使ってください。

      $ ruby-1.8.0 -we 'p Object.new.type'
      -e:1: warning: Object#type is deprecated; use Object#class
      Object

Object#to_a

  Object#to_a は将来廃止されます。Kernel#Array を使ってください。

      $ ruby-1.8.0 -e 'p Object.new.to_a'
      -e:1: warning: default `to_a' will be obsolete
      [#<Object:0x401ae3e4>]

      $ ruby-1.8.0 -we 'p Array(Object.new)'
      [#<Object:0x401ae3d0>]

FileTest.exists?

  三単現の S は付けないという命名規則に反するので避けるべきです。 FileTest.exist? を使ってください。 → [rubyist:1194]

indexes, indicies (Array, Hash, ENV)

  version 1.7 では、使用すると

      warning: Array#indexes is deprecated; use Array#select

  と警告が出ます。

  - indexの複数形はindexesとindicesの両方があるのが混乱のも と(両方提供してるけど)
  - index(値を指定してそのインデックスを得る)メソッド とindexes(インデックスを複数指定して対応する値の配列を得 る)は同じ単語なのに意味が逆というのは致命的

  ということからだそうです[ruby-dev:16084]。

  [ruby-talk:10830], [ruby-talk:11066], [ruby-dev:16082] などで議論が起こっていました。

  警告メッセージにあるように select がその候補になっています。

  ruby 1.8 feature: その後、values_at が採用されまし た[ruby-dev:20153]。

Array#filter

  Array#collect! に置き換えられました。

  このメソッドを使用すると警告メッセージが出ます。 (1.8 ではこのメソッドはなくなりました。)

Time.times

  Process.times に移動しました。 1.8 で `Time.times` を使うと警告されます。

      $ ruby-1.8.0 -e 'p Time.times'
      -e:1: warning: obsolete method Time::times; use Process::times
      #<struct Struct::Tms utime=0.0, stime=0.0, cutime=0.0, cstime=0.0>

iterator?

  メソッドに付いたブロックは必ずしも繰り返さないので、 ブロック付きメソッドをイテレータと呼ぶのは不適切です。 今後は block_given? を使ってください。

  が、イテレータという用語自体は依然使われ続けていますし、 この関数を使っても警告はされません。

ObjectSpace.add_finalizer
ObjectSpace.remove_finalizer
ObjectSpace.call_finalizer
ObjectSpace.finalizers

  Ruby 1.8 ではこれらのメソッドを使うと警告されます。 これらのメソッドは以前 final.rb で提供されていたメソッド

  - ObjectSpace.define_finalizer
  - ObjectSpace.undefine_finalizer

  が組み込みになったので不要です。 従って、今後は final.rb も obsolete です。

## 過去のクラス

NotImplementError

  NotImplementedErrorの旧称。 version 1.8 では既に削除されています。

MatchingData

  MatchDataの旧称

## 過去の組み込み変数、定数

`$~`, `$!` 等、全般

  なくなることはないと思いますが、基本的に使わないのが 最近のスタイルです。少なくとも今後増えることはありません。 無理に使うのをやめる必要はありませんが、代替になる記法が ある場合はそちらを使うほうがきれいになることが多々あります。 例えば (Regexp.last_match や Process.waitpid2、 rescue => var などです。

  ただし `$=` (文字列の比較で大文字小文字を無視するか決める) だけは obsolete であると明言されました ([ruby-dev:12978])。 Ruby 1.8 では警告が出ます。

      $ ruby-1.8.0 -e '$= = false'
      -e:1: warning: modifying $= is deperecated

  Ruby 1.8 では既に文字列のハッシュ値が $= の値に依存しなく なっています。[ruby-bugs-ja:PR#61]

      p "foobar".hash
      $= = true
      p "foobar".hash

      # Ruby 1.6.8 の結果
      594908901
      -24977883

      # Ruby 1.8.0 の結果
      594908901
      594908901

$defout, $deferr

  version 1.8 以降、$stdout, $stderr が代わりに利用されるようになりま した。version 1.8 では、$stdout, $stderr, $stdin にリダイレクトの効 果はなくなっています。($deferr は version 1.8.0 preview で定義された 変数です)。

  $defout, $deferr にオブジェクトを代入すると警告が出力されます。

TRUE, FALSE, NIL

  はるか昔のバージョンの Ruby では true false nil がなかったので 代わりに定数が使われていたのですが、今となっては不要です。 速やかに移行してください。

VERSION, RELEASE_DATE, PLATFORM

  Ruby 1.9 では廃止されました。それぞれ「RUBY_」を前置した RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_PLATFORM を使ってください。

## その他過去のもの

正規表現の //p オプション

  1.6 では警告されます。 1.8 では廃止されました。

  入れ代わりに m オプションが導入されましたが これは p オプションとは意味がまったく違います。 p はメタ文字「.」「^」「$」の意味を変えるオプションでした。 m は「.」を改行にマッチするように変えるだけです。

  p オプションが廃止されたのは以下の理由からです。

  - 定義が複雑である
  - //m と 正規表現 \A \Z を使って表現可能である
  - p と m を両方提供するにはフラグのビット数が足りない

  詳細は [ruby-list:22483] を参照してください。

links: [Array] [ENV] [FileTest] [Hash] [MatchData] [NotImplementedError] [ObjectSpace] [Process] [Regexp] [ruby 1.7 feature] [ruby 1.8 feature]
reverse links: [1.6.8から1.8.0への変更点(まとめ)] [Array] [ENV] [Hash] [Object] [Ruby変更履歴] [String] [ruby 1.7 feature] [ruby 1.8 feature] [組み込み定数] [組み込み変数]