请教Ruby的一个问题。

hunter0303 2009-11-30 12:01:50
Ruby的一个关于求数组的所有子集的程序,
下面的for循环中的对象区间判断,会修改j的值吗?还有j+a..j+b的对象区间是怎么变化的?

我增加打印看值的变化比较奇怪……

class Array

def powerset
num = 2**size
ps = Array.new(num, [])
self.each_index do |i|
a = 2**i
b = 2**(i+1) - 1
j = 0
while j < num-1
for j in j+a..j+b
ps[j] += [self[i]]
end
j += 1
end
end
ps
end

end

x = [1, 2, 3]
y = x.powerset
p y
...全文
107 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hunter0303 2009-12-05
  • 打赏
  • 举报
回复
已经明白了,多谢!
代码是The Ruby Way中的例子。

Ruby中的for类似迭代器,先计算区间表达式的值,将区间的每个值赋给循环变量,再执行循环体。
重要的是:循环变量不是循环的局部变量,退出循环后,仍然有意义。因此造成了例子中的j变量的变化。

感觉Ruby的For循环和C/C++完全是迥异的。
hunter0303 2009-12-01
  • 打赏
  • 举报
回复
j+a..j+b在什么时候计算呢?每次j值的变化都会引起区间的改变吗?

这个地方比较难以理解。
xiaodeshi 2009-12-01
  • 打赏
  • 举报
回复
这样理解,上例中,a,b在while循环之前,已经成定值。
j = 0
while j < num-1
for j in j+a..j+b
ps[j] += [self[i]]
end
j += 1
end
j第一次被赋值为0,然后到for循环中
就成了for j in 0+a..0+b
注意这里的语法for .. in 语法,for j in ...中的j可以使用其它变量名,这里使用j的意思只是一个新的变量,和上面的j不是一回事。

for ... in

end
是一个循环体,所以只要按我说的理解即可。

楼主的代码并不清楚是什么场景下得到的,所以只能就代码分析给你。
xiaodeshi 2009-11-30
  • 打赏
  • 举报
回复
j+a..j+b 是一个区间。在ruby中,如果你想从1到10循环
就是1..10.each
为什么会这样,因为在ruby中所有内容都被看作对象,所以出现你感觉奇怪的地方。

2,763

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ruby/Rails
社区管理员
  • Ruby/Rails社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧