2012-03-14 15 views
5

私はコード全体でハッシュのための{key: 'value'}構文を使ってRuby gemを書いています。私のテストはすべて1.9.xで合格しますが、私は(間違いなく)1.8.3でsyntax error, unexpected ':', expecting ')'を取得します。Ruby 1.8でのRuby 1.9のハッシュ構文のサポート

1.8.xをサポートするためのベストプラクティスはありますか?旧友の=>を使用してコードを書き直す必要があるのですか、それとも良い戦略がありますか?

+1

Ruby 1.8がすぐにフェードアウトする予定です。あなたはそれをサポートする必要はありません。 – sawa

+3

それは一般的な意見ですか?私は確かに他の宝石の作家が何をしているかについてのインプットを探しています。私はRubyコミュニティ内で1.9列車に乗ってみんなを得るための大きなプッシュがあることを知っています。私は個人的に1.8を残しても構いません。 – JackCA

答えて

16

あなたは運が悪いと思います.1.8をサポートしたい場合は、=>を使用する必要があります。いつものように、私はあなたが1.9である場合において=>を使用しなければならないことを言及します:

  1. キーがシンボルではない場合。どのオブジェクト(シンボル、文字列、クラス、浮動小数点数など)もRubyハッシュのキーとなりうることに注意してください。
  2. あなたが引用したいシンボルが必要な場合::'this.that'
  3. MongoDBを使用している場合は、:$set => hashだが$set: hashなどの文法エラーがあります。

定期的に予定されているプログラミングに戻ってください。

なぜあなたは運がなくなったと言いますか?ハッシュのリテラル構文(両方とも)はパーサーに配線されているので、パーサーをあなたの宝石からパッチングするのは大したことはないと思います。 Ruby 1.8.7's parse.yは、これは言っている:

assoc : arg_value tASSOC arg_value 
      { 
       $$ = list_append(NEW_LIST($1), $3); 
      } 
     ; 

tASSOC=>ので、ハッシュリテラルは、ハードワイヤード=>を使用することがあります。 1.9.3'sこれは言う:

assoc : arg_value tASSOC arg_value 
      { 
      /*%%%*/ 
       $$ = list_append(NEW_LIST($1), $3); 
      /*% 
       $$ = dispatch2(assoc_new, $1, $3); 
      %*/ 
      } 
     | tLABEL arg_value 
      { 
      /*%%%*/ 
       $$ = list_append(NEW_LIST(NEW_LIT(ID2SYM($1))), $2); 
      /*% 
       $$ = dispatch2(assoc_new, $1, $2); 
      %*/ 
      } 
     ; 

我々は再び脂肪矢印構文(arg_value tASSOC arg_value)およびJavaScriptのスタイル(tLABEL arg_value)を持っています。 AFAIK、tLABELは、JavaScriptスタイルの構文でどのような種類のシンボル(:$set:'this.that'、...)も使用できないという制限の原因となります。現在のトランクparse.yは、ハッシュリテラルに対して1.9.3と一致します。

したがって、ハッシュのリテラル構文はパーサーに配線されており、1.8をサポートしたい場合は太った矢印が付いています。

+0

とても素敵で徹底的な答え、ミー。 JSスタイルの構文を使用するインスタンスを書き直す必要があるようです。レガシーコードを書かずにレガシーバージョンをサポートする方法があればいいと思います。しかしこれは最善の策かもしれません。 – JackCA

1

Ruby 1.8.7では新しいハッシュ構文がサポートされていません。

あなたが必死にルビーの非YARVのCベースの実装上のハッシュ構文が必要な場合は、そこにあなたが

rvm install ruby-head --branch ruby_1_8 ; rvm ruby-head 
ruby -v 
ruby 1.8.8dev (2011-05-25) [i386-darwin10.7.0] 

が、1.9へのアップグレードを行うcanので、完全にサポートされていない1.8ヘッドブランチですへの道であります行く。

+0

私はJackCAの意図はRuby 1の宝石を提供することだと思います。8ユーザーが使用できますが、JackCAはRuby 1.8を使用していません。だから私はこれが助けになるとは思わない。 – sawa

関連する問題