2016-12-17 4 views
0

Я использую на мой взгляд тривиального кода, как этотПочему «loop do» выдает ошибку значения пустоты?

loop do 

    i++ 

    break if i > 5 

end 

, но когда я пытаюсь запустить я получить void value expression break if i > 5

, что я делаю неправильно? Что означает эта ошибка?

+2

i ++ не действителен в рубине. Попробуйте i + = i – Doon

+0

@ Вниз, это неправильно. Скорее, «i ++» просто не совпадает с «i + = 1». См. Мой ответ. –

ответ

1

i++ может быть вполне допустимо. Например,

1++ 3 
    #=> 4 
1++ 

3 
    #=> 4 

Это потому, что оба эти выражения обрабатываются в

1 + +3 

, а затем

1 + 3 
    #=> 4 

Ваше выражение поэтому эквивалентно

loop do 
    i + (break if i > 5) 
end 

AИсключение составляет, потому что break if i > 5 не возвращает значение.

Вы хотите

i = 0 
loop do 
    i += 1 
    break if i > 5 
end 
i #=> 6 

или (мое предпочтение)

i = 0 
loop do 
    i += 1 
    raise StopIteration if i > 5 
end 
i #=> 6 

Kernel#loop обрабатывает StopIteration исключение, вырываясь из петли.

+0

Ничего себе, это прекрасно объяснено. Спасибо. Ваш ответ дает лучшее объяснение моей проблемы, почему это происходит и как его избежать. –

2
i = 0 
loop do 
    i += 1 
    break if i > 5 
end 
+1

Хороший ответ. Мы также можем написать 'loop.with_index {| _, i | raise StopIteration, если i> 5} '. –

2

Что вы думаете? i++ сам по себе действительный Ruby code?

Хотя синтаксис Ruby часто легко угадать, не предполагайте, что он похож на другие языковые конструкции.

У Ruby также есть намного лучшие модели, чтобы делать что-то. Мой второй пример - пример того, что вы хотите.

i = 0 
loop do 
    i = i + 1 # or shorthand i += 1 
    puts i 
    break if i > 5 
end 

В действительности это рассчитывает до 6. Ваш break должен быть в самом начале.

Лучший способ

1.upto 5 do |i| 
puts i 
end 

Это считается до 5.

+1

'(1..5) .each {| i | puts i} 'тоже неплохо. –

+0

да и для онлайновой линии рекомендуется, но я сомневаюсь, что в случае с OP и для новичков это не так ясно – peter

+0

OP может думать, что 'i ++' действительно является кодом Ruby, потому что это так! :-) –