2012-03-14 23 views
5

Kodumdaki karmalar için {key: 'value'} sözdizimini kullanarak bir Ruby gem yazıyorum. Testlerim hepsi 1.9.x içinde geçiyor, ama ben (anlaşılır şekilde) 1.8.7'de syntax error, unexpected ':', expecting ')' aldım.Ruby 1.8'in Ruby 1.8'in karma sözdizimini destekleme

1.8.x'i desteklemek için en iyi yöntem var mı? Eski arkadaşımız =>'u kullanarak kodu yeniden yazmam gerekiyor mu, yoksa daha iyi bir strateji var mı?

+1

Yakut 1.8 yakında sönmeye başlayacak. Bunun için desteğe ihtiyacınız yok. – sawa

+3

Bu popüler bir fikir mi? Kesinlikle diğer Gem yazarlarının neler yaptığı üzerine girdim. Ruby topluluğunda 1.9 herkese ulaşmak için büyük bir itici güç olduğunu biliyorum. Kişisel olarak, 1.8'i geride bıraktığımı düşünmüyorum. – JackCA

cevap

16

Bence şanstan yoksun, 1.8'i desteklemek istiyorsanız, =>'u kullanmalısınız. Her zamanki gibi, sana 1.9 de bazı durumlarda => kullanması gerektiğini belirtilecek:

  1. anahtar sembolü değilse. Herhangi bir nesnenin (semboller, dizgiler, sınıflar, yüzer, ...) Ruby Hash içinde bir anahtar olabileceğini unutmayın.
  2. Alıntı yapacak bir simgeye ihtiyacınız varsa: :'this.that'.
  3. Eğer hemen hemen her şey için MongoDB kullanırsanız :$set => hash gibi şeyler kullanacaksınız ama $set: hash bir sözdizimi hatası.

Düzenli olarak programlanmış programlamaya geri dönün.

Neden şanssız olduğunuzu söylüyorum? Hash sözdizimi sözdizimleri (her ikisi de) ayrıştırıcıda sabitlenmiştir ve ayrıştırıcıyı mücevherinizden çok fazla şansa sahip olacağınızı düşünmüyorum. Ruby 1.8.7's parse.y bu konuda şöyle demektedir:

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

ve tASSOC=> böylece karma değişmezleri sert kablolu => kullanmak olmasıdır.

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); 
      %*/ 
      } 
     ; 

Biz yine yağ ok sözdizimi (arg_value tASSOC arg_value) ve JavaScript stili (tLABEL arg_value) var;: 1.9.3's bu diyor AFAIK, tLABEL, JavaScript stili sözdizimi ile hangi türden sembollerin (:$set, no :'this.that', ...) kullanılabileceğine dair kısıtlamaların kaynağıdır. Mevcut durum parse.y, Hash hazırlıkları için 1.9.3 ile eşleşiyor.

Bu nedenle, Hash'ın sözdizimi sözdizimi ayrıştırıcıya bağlanır ve 1.8'i desteklemek istiyorsanız yağ oklarıyla takılırsınız.

+0

çok güzel ve kapsamlı bir cevap, mu. JS stili sözdizimini kullandığım örnekleri yeniden yazmam gerekebilir gibi görünüyor. Sadece eski sürümleri eski kod yazmadan desteklemenin bir yolu olsaydı. Bu olsa iyi bir bahis olabilir. – JackCA

1

Ruby 1.8.7, yeni karma sözdizimini desteklemiyor.

Umutsuzca Ruby olmayan YARV c tabanlı uygulanmasına ilişkin karma sözdizimi gerekiyorsa, orada

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

ancak 1.9 yükseltme yapmak can böylece, tamamen desteksiz 1.8 kafa dalıdır yoludur gitmek.

+0

Bence JackCA'nın amacı bir Ruby 1'e bir mücevher sağlamaktır.8 kullanıcı kullanabilir, JackCA Ruby 1.8 kullanıyor. Bu yüzden bunun yardımcı olacağını düşünmüyorum. – sawa