2010-05-02 2 views
7

다음 코드 단편은 Mac OS X의 1.8.7에서는 잘 동작하지만, 우분투에서는 1.8.6에서는 잘 동작하지 않습니다. 왜? 해결 방법이 있습니까? 1.8.7에서왜 6.x.map가 ruby ​​1.8.7에서 작동 하나 1.8.6이 아닌지

작품 : 1.8.6에서

$ 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"] 
>> 

하지만하지 :

# 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> 

왜 차이가? 1.8.6의 해결 방법은 무엇입니까?

답변

16

times과 같은 반복자 메서드는 블록없이 호출되는 경우 열거자를 반환합니다. 1.8.6에서는

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

또는이 특정 사용 케이스를 위해해야 ​​할 1.8.7은 열거 객체를 반환하는 동안 당신은 단순히 주어진 블록에 (0...6).map {...}

+2

또는 'require'backports'' ... –

+0

이제는 필요한 백 포트 만 요구할 수 있습니다. 이 경우 ...'backports/1.8.7/integer/times'' –

1

1.8.6 때문에 #times 수익률을 할 수 계속해서 Enumerable을 구현할 수 있습니다.

6

루비 1.9에서는 블록을 사용하지 않고 호출 한 경우 반복을 수행 한 함수가 Enumerator 객체를 반환하도록 라이브러리가 변경되었습니다. 다른 많은 언어 기능들도 바뀌었고, 언어 전체를 개선하기 위해 Ruby 1.8.x와 Ruby 1.9 사이의 호환성이 깨졌습니다. 대부분의 사람들은 이것을 너무 비참하게 생각하지 않았습니다.

Ruby 개발 팀은 Ruby 1.8.7이 Ruby 1.9에서 소개 된 라이브러리 기능 중 일부를 추가하는 전환 릴리스 여야한다고 결정했습니다. 그들은이 결정에 대해 많은 비판을했으며 많은 기업의 Ruby 사용자는 Ruby 1.8.6에서 레일스를 계속 실행했습니다 (많은 사람들이 여전히 남아 있습니다). 1.8.7이 도입 된 변경 사항이 너무 크고 위험하기 때문입니다. 그럼에도 불구하고 1.8.7이 남아 있고 반복 함수가 반환됩니다. Enumerators는 통합 된 기능 중 하나입니다.

1.8.6에없는 1.8.7에서 보는이 마이그레이션 기능입니다.

대답은 좋은 해결책을 제공합니다. 그 숫자를 더하는 것이별로 없습니다.

+0

배경 정보를 제공해 주셔서 감사합니다. 정말 잘 알고 있습니다. – Lee

+0

나는 1.8.7이 대부분 호환성이 있다고 덧붙인다. 그렇지 않을 때는 1.9가되지 않을 것이다. 이 질문 확인 http://stackoverflow.com/questions/2544185/upgrade-ruby-projects-from-1-8-6-to-1-8-7/2545416#2545416 –

1

루비 1.8.7은 many changes을 소개합니다. Ruby 1.8.6에서 사용하고 싶다면 간단히

require 'backports' 

그게 전부입니다. 1.8.3 또는 단지 필요한 백 포트의 변경을 위해 require 'backports/1.8.7'이 가능할지라도 1.9.1 및 다음 1.9.2의 여러 가지 방법을 제공합니다. require 'backports/1.8.7/integer/times'

관련 문제