2012-03-14 25 views
5

Tôi đang viết một gem Ruby sử dụng cú pháp {key: 'value'} cho các hash trong mã của tôi. Các bài kiểm tra của tôi đều được chuyển qua phiên bản 1.9.x, nhưng tôi (dễ hiểu) nhận được syntax error, unexpected ':', expecting ')' trong 1.8.7.Hỗ trợ cú pháp băm của Ruby 1.9 trong Ruby 1.8

Có phương pháp hay nhất để hỗ trợ phiên bản 1.8.x không? Tôi có cần phải viết lại mã bằng cách sử dụng người bạn cũ của chúng tôi => hoặc có chiến lược tốt hơn không?

+1

Ruby 1.8 sẽ sớm biến mất. Bạn không cần hỗ trợ cho nó. – sawa

+3

Đó có phải là một ý kiến ​​phổ biến? Tôi chắc chắn đang tìm kiếm đầu vào về những gì các tác giả Gem khác đang làm. Tôi biết có một sự thúc đẩy lớn trong cộng đồng Ruby để có được tất cả mọi người trên tàu 1.9. Cá nhân tôi không phiền khi bỏ 1.8 sau. – JackCA

Trả lời

16

Tôi nghĩ bạn đã hết may mắn, nếu bạn muốn hỗ trợ 1.8 thì bạn phải sử dụng =>. Như thường lệ, tôi sẽ đề cập rằng bạn phải sử dụng => trong một số trường hợp nhất định trong 1,9:

  1. Nếu khóa không phải là biểu tượng. Hãy nhớ rằng bất kỳ đối tượng nào (biểu tượng, chuỗi, lớp, float, ...) đều có thể là một khóa trong Ruby Hash.
  2. Nếu bạn cần một biểu tượng bạn muốn báo giá: :'this.that'.
  3. Nếu bạn sử dụng MongoDB cho khá nhiều thứ bạn sẽ sử dụng những thứ như :$set => hash nhưng $set: hash là lỗi cú pháp.

Quay lại chương trình được lập lịch thường xuyên của chúng tôi.

Tại sao tôi lại nói rằng bạn không may mắn? Cú pháp Hashalal (cả hai) đều có dây cứng trong trình phân tích cú pháp và tôi không nghĩ rằng bạn sẽ có nhiều may mắn khi vá phân tích cú pháp từ đá quý của bạn. Ruby 1.8.7's parse.y có này để nói:

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

tASSOC=> literals nên băm là cứng có dây để sử dụng =>. 1.9.3's nói điều này:

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

Chúng ta có cú pháp mỡ mũi tên một lần nữa (arg_value tASSOC arg_value) và phong cách hoạt Javascript (tLABEL arg_value); AFAIK, tLABEL cũng là nguồn gốc của các hạn chế về loại biểu tượng nào (không có :$set, không :'this.that', ...) có thể được sử dụng với cú pháp kiểu JavaScript. Các thân cây hiện tại parse.y phù hợp với 1.9.3 cho Hash literals.

Vì vậy cú pháp chữ băm được nối cứng vào trình phân tích cú pháp và bạn bị mắc kẹt với mũi tên chất béo nếu bạn muốn hỗ trợ 1.8.

+0

câu trả lời rất hay và kỹ lưỡng, mu. Có vẻ như tôi có thể phải viết lại các trường hợp mà tôi sử dụng cú pháp kiểu JS. Chỉ muốn có một cách để hỗ trợ các phiên bản cũ mà không cần viết mã cũ. Đây có thể là đặt cược tốt nhất. – JackCA

1

Ruby 1.8.7 không hỗ trợ cú pháp băm mới.

Nếu bạn rất cần cú pháp băm vào phi YARV c dựa trên việc thực hiện Ruby, có một chi nhánh 1.8 đầu hoàn toàn không được hỗ trợ, vì vậy bạn can làm

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

nhưng nâng cấp lên 1.9 là cách để đi.

+0

Tôi nghĩ rằng ý định của JackCA là cung cấp một viên ngọc mà Ruby 1.8 người dùng có thể sử dụng, không phải là JackCA đang sử dụng Ruby 1.8. Vì vậy, tôi không nghĩ rằng điều này sẽ giúp. – sawa