ruby并行分配,步问题

时间:2010-03-09 10:06:27

标签: ruby mass-assignment

所以,我正在尝试通过做一些项目的euler问题来学习ruby,我遇到了一些我无法解释的事情和逗号操作符?是在两者的中间。我还没有找到这方面的好文档,也许我只是不按照我的意愿使用谷歌,但好的ruby文档似乎有点稀疏。 。

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'行正在做什么?从我可以收集的内容来看,step命令的工作方式类似于(range).step(step_size),但这似乎在做(starting_point).step(ending_point,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 个答案:

答案 0 :(得分:5)

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时停止。

Ruby中的第二个step用于Range

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

它需要范围(具有开始和结束)并且每隔一个元素迭代它。它是不同的,因为你可以传递它不一定是数字范围,它将从它获取每个第n个元素。

查看http://ruby-doc.org/core-1.8.7/index.html

答案 1 :(得分:2)

  1. 这是parallel assignment。在您的示例中,Ruby首先评估nxtcur + nxt。然后,它会将结果分别分配给curnxt

  2. 代码中的step方法实际上是Numeric#step(范围是使用(n..m)构建的)。 step Numeric方法使用调用的数字作为起点进行迭代。参数分别是限制和步长。因此,上面的代码将使用i * i调用块,然后逐步增加i,直到达到max

  3. Ruby文档的一个很好的起点是ruby-doc.org站点。