Что означает «доходность без блока» в Ruby? - PullRequest
3 голосов
/ 23 сентября 2008

Я новичок в Ruby и пробую следующее:

mySet = numOfCuts.times.map{ rand(seqLength) }

но я получаю ошибку 'yield вызывается из блока'. Я не уверен, что он имеет в виду. Кстати, этот вопрос является частью более общего вопроса, который я задал здесь .

Ответы [ 5 ]

9 голосов
/ 23 сентября 2008

Проблема в том, что метод times ожидает получить блок, которому он будет управлять. Однако вы не передали ему блок. Есть два способа решить это. Во-первых, не использовать раз:

mySet = (1..numOfCuts).map{ rand(seqLength) }

или передать ему блок:

mySet = []
numOfCuts.times {mySet.push( rand(seqLength) )}
1 голос
/ 23 сентября 2008

Бинго, я только что узнал, что это такое. Это ошибка JRuby.

Под МРТ

>> 3.times.map
=> [0, 1, 2]
>> 

Под JRuby

irb(main):001:0> 3.times.map
LocalJumpError: yield called out of block
    from (irb):2:in `times'
    from (irb):2:in `signal_status'
irb(main):002:0> 

Так вот, я не знаю, правильно ли MRI (стандартная реализация Ruby) работает здесь. Возможно, он должен жаловаться, что это не имеет смысла, но когда в MRI вызывается n.times, он возвращает Enumerator, тогда как Jruby жалуется, что ему нужен блок.

1 голос
/ 23 сентября 2008

Вы комбинируете функции, которые, кажется, не имеют смысла - если numOfCuts является целым числом, то просто используя раз и блок будет запускать блок много раз (хотя он возвращает только исходное целое число:

irb(main):089:0> 2.times {|x| puts x}
0
1
2

map - это функция, которая работает с диапазонами и массивами и возвращает массив:

irb(main):092:0> (1..3).map { |x| puts x; x+1 }
1
2
3
[2, 3, 4]

Я не уверен, что вы пытаетесь достичь с помощью кода - что вы пытаетесь сделать? (вместо того, чтобы спрашивать конкретно о том, что кажется неправильным синтаксисом)

1 голос
/ 23 сентября 2008

, если "numOfCuts" является целым числом,

5.times.foo   

недействительно

«раз» ожидает блок.

5.times{   code here   } 
0 голосов
/ 23 сентября 2008

Integer.times ожидает блок. Сообщение об ошибке означает, что оператор yield внутри метода times не может быть вызван, потому что вы не задали ему блок.

Что касается вашего кода, я думаю, что вы ищете диапазон:

(1..5).map{ do something }

Вот твой рубидок для Integer.times и Range .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...