0

所以,我试图通过做一些项目欧拉问题来学习红宝石,我遇到了一些我无法解释的事情,以及逗号?运算符?位于两者的中间。我一直没能找到好的文档,也许我只是没有按照我应该的那样使用谷歌,但是好的 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(", ")
4

2 回答 2

5

1:称为并行赋值。Ruby 关心创建时间变量,而不是用不正确的值覆盖你的变量。所以这个例子:

cur, nxt = nxt, cur + nxt

是相同的:

tmp = cur + nxt
cur = nxt
nxt = tmp

bur更紧凑,没有地方犯愚蠢的错误等等。

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

于 2010-03-09T10:33:06.307 回答
2
  1. 这是一个并行作业。在您的示例中,Ruby 首先评估nxtand cur + nxt。然后将结果分别分配给curnxt

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

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

于 2010-03-09T10:32:33.977 回答