参考:Ruby2.0.0への移行について(Ruby文法・ライブラリ編)

Ruby2.0.0化に併せて、変更せざるをえなかった箇所をメモしておきます(文字エンコーディング関係は次項)。
下記はあくまでもBOTシステム上の変更点のみで、Ruby1.9以降の仕様変更のまとめではありません。こちらこちらをご覧になることをお勧めします。

私は(書籍を参考に)極力1.8/1.9共通の文法で記述するように心がけていましたが、Web上のソースを参考とした箇所にいくつかの落とし穴がありました(★の部分)。

ユーザー定義のrequireに、"./"を付加しないとエラーに

1.8.7、1.9系以降共通の文法に変更。

require "./hogehoge"

ArrayのString化にto_sを使った場合、期待した結果にはならない(★)

str = ary.to_s

を、1.8.7、1.9系以降共通の文法に変更。

str = ary.join

each_with_indexにインスタンス変数が使えない(★)

下記のように、1.8.7、1.9系以降共通の文法に変更。

hoge.each_with_index do |x, y|
  @x = x
  @y = y
end

メソッドを抜けるnextは1.9以降エラーに(★)

def hoge()
  next if 条件
end

…を、下記のように、1.8.7、1.9系以降共通の文法に変更。

def hoge()
  return if 条件
end

GEMライブラリ上のextractcontentが1.9以降エラーとなる

正規表現の仕様変更によるものらしいが、多くのサイトの本文切り出しをextractcontentで行っていたので、これは痛かった。ただ、検索したところ、1.9以降でも使用できるバージョンが存在していることを知り、こちらを使うことに。

if RUBY_VERSION <= '1.8.7' # 1.8.7
  require 'extractcontent'
else # 1.9系以降
  require './任意のディレクトリ/extractcontent.rb'
end

シンプルな構成のライブラリですので、ソースを自分のフォルダにコピーして使っています。GEMで管理する方法もあるようですが、そこまでは行っていません。

open-uriで「https://〜」のサイトを扱うとエラーとなる

net/httpを使う方法もあるようですが、私はMechanizeを使うことにしました。

agent = Mechanize.new
if url.include?("https://")
  # SSLのバージョンをセット
  agent.ssl_version = 'SSLv3'
end
agent.get(url)

Twitter関連のoauthの挙動がおかしい

エラーが頻発したため、調べたところoauthに問題がある模様。
こちらのサイトからoauth-patch.rbをコピーし、組み込むことで、それらのエラーは落ち着きました。

require 'oauth'
require './任意のディレクトリ/oauth-patch.rb' unless RUBY_VERSION <= '1.8.7' # 1.9系以降

ActiveRecoedのscopeにlambdaの記述が無いとワーニングが発生する(★)

ActiveRecoedの以前のバージョンではこのような記述でもOKでしたが…

scope :find_amazon_18kin, where("adult_flag='1'")

ActiveRecoedの最近のバージョンではlambdaを指定しないとワーニングが発生します。

scope :find_amazon_18kin, lambda {where("adult_flag='1'")} # 1.8.7以降共通の文法

Web上ではlambdaの代わりに「->」を使用している例題が散見されますが、1.8.7ではエラーとなるので注意。

scope :find_amazon_18kin, -> {where("adult_flag='1'")} # ->は1.8.7ではエラーとなる

JSONの記述ミスによる挙動の違い

  "サイトA" : {
    "url" : ["http://www.hogehoge.co.jp/index.rdf"],
    "rss_title" : "title",
    "rss_link" : "link"
    },
  "サイトB" : {
    "url" : ["http://www.foobar.co.jp/rss.xls"],
    "rss_title" : ["title"],
    "rss_link" : ["link"]
    },

jsonライブラリでパースした場合、サイトAのrss_titleはStringとなりますが、サイトBではArrayとなります。1.8.7までは仕様が緩く(あるいはダック・タイピングのおかげで?)これでもうまく処理出来ていましたが、1.9以降はそのあたりが厳格化していますので注意。
(XMLでも同様かと…)