2010-05-02 23 views
7

Aşağıdaki kod snippet'i Mac OS X'de 1.8.7'de çalışıyor ancak Ubuntu'da 1.8.6'da çalışmıyor. Niye ya? Bir çözüm var mı? 1.8.7 yılındaNeden 6times.map, 1.8.7 ruble'de çalışıyor ancak 1.8.6 değil

İşleri: 1.8.6 yılında

$ ruby --version 
ruby 1.8.7 (2009-06-08 patchlevel 173) [universal-darwin10.0] 
ltredgate15:eegl leem$ irb 
>> 6.times.map {'foo'} 
=> ["foo", "foo", "foo", "foo", "foo", "foo"] 
>> 

Ama:

# ruby --version 
ruby 1.8.6 (2008-08-11 patchlevel 287) [i686-linux] 
Ruby Enterprise Edition 20090610 
# irb 
irb(main):001:0> 6.times.map {'foo'} 
LocalJumpError: no block given 
     from (irb):1:in `times' 
     from (irb):1 
irb(main):002:0> 

Neden bir fark var? 1.8.6 için geçici çözüm nedir?

cevap

16

times gibi 1.8.7+ yineleyici yöntemlerinde, blok olmadan çağrılırlarsa bir numaralandırıcı döndürürler. 1.8.6 size

require 'enumerator' 
6.enum_for(:times).map {...} 

Ya da bu özel kullanım durumu için yapmak zorunda 1.8.7 bir Enumerator nesnesi döndüren ise sadece, verilen blokta (0...6).map {...}

+2

Ya da 'backports' gerektirir ... –

+0

Artık yalnızca ihtiyaç duyduğunuz yedekleri isteyebilirsiniz. Bu durumda ... 'backports/1.8.7/integer/times'' gerektirir –

1

1.8.6 Çünkü #times verimi yapabilirdi Enumerable'ı koruyabilir ve uygulayabilirsiniz.

6

Ruby 1.9'da, kitaplık değiştirildi; bu nedenle yineleme işlemi, bir blok olmadan çağrılırsa bir Enumerator nesnesini döndürecek işlevlerdi. Diğer tüm dil özellikleri de değişti ve dilin bir bütün olarak geliştirilmesi amacıyla Ruby 1.8.x ve Ruby 1.9 arasında uyumluluğun kırılacağı yaygın olarak biliniyordu. Çoğu insan bunu çok üzücü bulmadı.

Ruby geliştirme ekibi, Ruby 1.8.7'nin Ruby 1.9'un tanıttığı bazı kitaplık özelliklerini ekleyerek bir geçiş sürümü olması gerektiğine karar verdi. Karar için çok eleştiriler aldılar ve birçok Ruby Şirketi, 1.8.6'daki Rails'i çalıştıran (ve birçoğu hala) Rails'i korudu. Çünkü 1.8.7'deki değişiklikler çok büyük ve çok riskliydi. Ancak, yine de 1.8.7 kalır ve yineleme işlevlerine geri döner. Enumerators, dahil edilen özelliklerden biridir.

Bu, 1.8.7'de bulunmayan 1.8.7'de gördüğünüz bu geçiş özelliğidir.

sepp2k'in yanıtı iyi bir çözüm sunuyor. Bu sayımı eklemek için fazla bir şey yok.

+0

arka plan bilgisi için teşekkürler, gerçekten bilmek güzel. – Lee

+0

Bu 1.8.7 çoğunlukla uyumlu olduğunu ekledim (ve olmadığında, 1.9 olmayacak). Bu soruyu kontrol edin http://stackoverflow.com/questions/2544185/upgrade-ruby-projects-from-1-8-6-to-1-8-7/2545416#2545416 –

1

Ruby 1.8.7, many changes'u tanıtır. Bunları Ruby 1.8.6'da kullanmak isterseniz, sadece

require 'backports' 

Bu kadar. Bu 1,9.7 ve hatta sadece 1.9.2 değişiklikleri için require 'backports/1.8.7' mümkün olsa da, 1.9.1 ve yaklaşan 1.9.2 de birçok yöntem sağlar, hatta sadece ihtiyaç duyacağınız backports, örn. require 'backports/1.8.7/integer/times'

İlgili konular