Синтаксическая ошибка Ruby Array #bsearch из Programming Ruby?

Скопируйте этот код из книги Programming Ruby и запустите его на rubyfiddle.com. Получаете синтаксическую ошибку вместо # => 21​ ? Любая помощь приветствуется!

arr = [ 1, 1, 2, 3, 5, 8, 13, 21, 34 ]
res = arr.bsearch ​do​ |val|
  ​case​
​    ​when​ val < 19 ​then​ +1
​   ​when​ val > 23 ​then​ -1
​   ​else​ 0
​  end​  ​  
​end​
​   
res ​# => 21​

person user3222947    schedule 06.05.2014    source источник
comment
Что такое точная синтаксическая ошибка?   -  person Pavan    schedule 06.05.2014
comment
Синтаксическая ошибка вывода @Pavan:   -  person user3222947    schedule 06.05.2014
comment
Не могли бы вы просто скопировать ошибку или строку ошибки и опубликовать ее в своем вопросе, пожалуйста.   -  person Pavan    schedule 06.05.2014
comment
@Pavan (eval):48: неопределенный метод `bsearch' для [1, 1, 2, 3, 5, 8, 13, 21, 34]: Array (NoMethodError) => Я получаю эту ошибку в labs.codecademy.com   -  person user3222947    schedule 06.05.2014
comment
stackoverflow .com/questions/8672472/   -  person Dave Newton    schedule 06.05.2014
comment
Какая у вас версия Ruby?   -  person Pavan    schedule 06.05.2014
comment
Код странно написан и еще более странно отформатирован, но я не вижу в коде синтаксической ошибки. Предоставьте точный код, который вызывает синтаксическую ошибку, сообщите нам, на какой строке возникает ошибка, и предоставьте точный сообщение об ошибке.   -  person Jörg W Mittag    schedule 07.05.2014


Ответы (2)


Я сам протестировал ваш код, и в том, что вы написали, нет ничего плохого. По всей вероятности, вы (или, в данном случае, codecademy) используете более старую версию Ruby. Метод bsearch был определен в Array и Range в Ruby 2.0. До Ruby 2.0 существовало несколько драгоценных камней, которые можно было использовать для выполнения бинарного поиска в массиве.

Чтобы проверить, какую версию Ruby вы используете, введите следующее в irb или консоль codecademy:

> RUBY_VERSION
=> "2.1.1" 

Если возвращаемое число меньше "2.0", bsearch не будет изначально определено ни для Array, ни для Range.

person wvandaal    schedule 06.05.2014
comment
@ JörgWMittag да, если вы читаете комментарии ОП, ошибка была undefined method 'bsearch' for [1, 1, 2, 3, 5, 8, 13, 21, 34]:Array(NoMethodError) - person wvandaal; 07.05.2014

Как вы указали в одном из ваших комментариев, точная ошибка:

(eval):48: undefined method `bsearch' for [1, 1, 2, 3, 5, 8, 13, 21, 34]:Array (NoMethodError)

Эта ошибка означает, что метод bsearch не существует для Array.


На labs.codecademy.com

 > RUBY_VERSION
=> "1.8.7"

В Ruby 1.8.7 нет bsearch.
bsearch было реализовано в Ruby 2.0.

person Micka    schedule 06.05.2014
comment
Точная ошибка, как указано в одном из комментариев пользователя @user3222947: (eval):48: undefined method 'bsearch' for [1, 1, 2, 3, 5, 8, 13, 21, 34]:Array (NoMethodError) - person Micka; 07.05.2014
comment
@JörgWMittag, я добавил указанную ошибку в свой ответ. - person Micka; 07.05.2014
comment
Это не синтаксическая ошибка (SyntaxError), это семантическая ошибка (NoMethodError). ОП трижды упомянул, что он также получает синтаксическую ошибку, это что меня озадачивает. NoMethodError очевидно. - person Jörg W Mittag; 07.05.2014
comment
@ JörgWMittag, у тебя есть это. syntax error в вопросе означает только error. Тогда ошибка должна была быть указана и в вопросе, но написана только в разделе комментариев. Здесь много вводящих в заблуждение ошибок. - person Micka; 07.05.2014