参考: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でも同様かと…)