Проблема постижения рубиновых петель в стиле C - PullRequest
2 голосов
/ 24 октября 2009

Мне трудно получить .each do, поэтому я надеялся на регулярное использование C для синтаксиса цикла, который, кажется, не работает, поэтому я попробовал некоторое время, но все еще получаю ошибки.

Я пробовал это.

i = 0
while i < SampleCount
    samples[i] = amplitude
    amplitude *= -1
    i++
end

Я получаю жалобы на окончательное утверждение здесь.

Ответы [ 5 ]

8 голосов
/ 24 октября 2009

Есть несколько проблем с вашим кодом. Вместо того, чтобы просто исправлять ошибки, я бы посоветовал вам лучше изучить Ruby в долгосрочной перспективе - это сэкономит ваше время и энергию позже. В данном случае это

5.times do |i|
  samples[i] = amplitude  # assumes samples already exists and has 5 entries.
  amplitude *= -1
end

Если вы настаиваете на сохранении подобного стиля, вы можете сделать это:

samples = []
i = 0
while i < sample_count
    samples << amplitude  # add new item to array.
    amplitude *= -1
    i += 1                # you can't use ++.
end

Обратите внимание, что начальная заглавная буква SampleCount, согласно соглашению Ruby, означает константу, которую, как я предполагаю, вы не имеете в виду.

2 голосов
/ 24 октября 2009

Я согласен с Питером , что в Ruby есть и другие (более идиоматические) способы сделать это, но для ясности: сообщение об ошибке, которое вы видели, неверно направило вас. С вашей while петлей как таковой не было ничего плохого. Проблема была i++, так как в Ruby нет оператора ++.

Это будет прекрасно работать:

limit = 10

i = 0
while i < limit
    puts i
    i += 1
end

Опять же, я не рекомендую его, но если вы просто изучаете язык, это может помочь узнать, где на самом деле была проблема.

В Ruby есть много встроенных способов итерации, отличных от for или while (которые, как я могу судить, обычно бывают реже). Несколько других примеров:

(1..10).each do |x| # 1..10 is a range which you can iterate over with each
  puts x
end

1.upto(10) { |x| puts x } # Integers have upto and downto methods that can be useful
1 голос
/ 24 октября 2009

Вы изначально упоминали, что пытались использовать цикл for. Несмотря на различные другие комментарии в ответах, вот подход цикла for:

for i in 0...5
  samples[i] = amplitude
  amplitude *= -1
end
0 голосов
/ 26 октября 2009

Проблема с оператором end связана с i++. Руби хочет что-то добавить. В Ruby нет оператора приращения. Вам нужно использовать i += 1. С этим изменением вы можете использовать цикл C как есть.

0 голосов
/ 25 октября 2009

Никто здесь на самом деле не предлагал альтернативного решения, которое фактически делает то, что первоначально предполагал Фред, - и это повторяет значение константы SampleCount. Так что вы могли бы сделать:

SampleCount.times do |i|

Или:

limit = SampleCount
limit.times do |i|

Или:

for i in 0..SampleCount

Достаточно ли одного из них в стиле Ruby?

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