параллельное задание ruby, вопрос-шаг - PullRequest
0 голосов
/ 09 марта 2010

Итак, я пытаюсь выучить ruby, задавая вопросы по проекту euler, и столкнулся с парой вещей, которые я не могу объяснить, и оператор запятой? находится в середине обоих. Я не смог найти хорошую документацию для этого, может быть, я просто не использую Google, как я должен, но хорошая рубиновая документация кажется немного разреженной. , .

1: как вы описываете, как это работает? первый фрагмент - это код ruby, который я не понимаю, второй - код, который я написал и который делает то же самое только после тщательного отслеживания первого:

#what is this doing?
cur, nxt = nxt, cur + nxt

#this, apparently, but how to describe the above?
nxt = cur + nxt   
cur = nxt - cur   

2: как в следующем примере описать, что делает строка с 'step'? из того, что я могу собрать, команда шага работает как (range) .step (step_size), но это, кажется, делает (начальная точка) .step (конечная точка, step_size) Я прав с этим предположением? где мне найти хороший документ об этом?

#/usr/share/doc/ruby1.9.1-examples/examples/sieve.rb  
# sieve of Eratosthenes
max = Integer(ARGV.shift || 100)
sieve = []
for i in 2 .. max
  sieve[i] = i
end

for i in 2 .. Math.sqrt(max)
  next unless sieve[i]
  (i*i).step(max, i) do |j|
    sieve[j] = nil
  end
end
puts sieve.compact.join(", ")

Ответы [ 2 ]

5 голосов
/ 09 марта 2010

1: это называется параллельным присваиванием. Ruby заботится о создании временных переменных и не переопределяет ваши переменные с неверными значениями. Итак, этот пример:

cur, nxt = nxt, cur + nxt

совпадает с:

tmp = cur + nxt
cur = nxt
nxt = tmp

Более компактный, без места для глупой ошибки и т. Д.

2: в библиотеке ядра ruby ​​есть 2 step методов. Первый - для Numeric класса (каждый номер), поэтому вы можете написать:

5.step(100, 2) {}

и начинается с 5 и отбирает у него каждое второе число, останавливается, когда достигает 100.

Второй step в Ruby предназначен для Range:

(5..100).step(2) {}

и он берет диапазон (который имеет начало и конец) и перебирает его, принимая каждый второй элемент. Он отличается, потому что вы можете передать его необязательно числовым диапазоном, и он возьмет из него каждый n-й элемент.

Взгляните на http://ruby -doc.org / core-1.8.7 / index.html

2 голосов
/ 09 марта 2010
  1. Это параллельное присваивание . В вашем примере Ruby сначала оценивает nxt и cur + nxt. Затем он присваивает результаты cur и nxt соответственно.

  2. Метод step в коде на самом деле является Numeric#step (диапазоны построены с (n..m)). Метод step для Numeric выполняет итерацию, используя номер, для которого он вызывается, в качестве отправной точки. Аргументами являются лимит и размер шага соответственно. Таким образом, приведенный выше код вызывает блок с i * i, а затем каждое последующее приращение i до достижения max.

Хорошей отправной точкой для документации по Ruby является сайт ruby-doc.org .

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