我有这段代码:
1 #!/local/usr/bin/ruby
2
3 users = (1..255).to_a
4
5 x = " "
6 y = " "
7 z = " "
8 #a = " "
9
10 count = 1
11 users.each do |i|
12 x << i if count == 1
13 y << i if count == 2
14 z << i if count == 3
15 # if x.length == 60
16 # a << i if count == 1
17 # a << i if count == 2
18 # a << i if count == 3
19 # else
20 # end
21 if count == 3
22 count = 1
23 else
24 count += 1
25 end
26 end
27
28 puts x.length
29 puts y.length
30 puts z.length
31 #puts a.length
32
这段代码的作用是将数字1-255附加到三个不同的字符串中,并输出每个字符串中有多少个数字。
IT工作
工作代码示例:
[user@server ruby]$ ruby loadtest.rb
86
86
86
[user@server ruby]$
现在我想要它做的是有一个名为a
的故障安全,如上所示,注释掉了,我想要的是,如果每个字符串包含60个数字,我希望它附加到{{1} }字符串,直到没有更多数字。
当我尝试使用注释掉的部分时,它会输出:
a
WHY?我做错了什么?
答案 0 :(得分:2)
这段代码的作用是将数字1-255附加到三个不同的字符串中,并输出每个字符串中有多少个数字。
在减少为了便于阅读而迭代的值的数量之后,这是它正在做的事情:
users = (1..5).to_a
x = " "
y = " "
z = " "
count = 1
users.each do |i|
x << i if count == 1 # => " \u0001", nil, nil, " \u0001\u0004", nil
y << i if count == 2 # => nil, " \u0002", nil, nil, " \u0002\u0005"
z << i if count == 3 # => nil, nil, " \u0003", nil, nil
if count == 3
count = 1
else
count += 1
end
end
x # => " \u0001\u0004"
y # => " \u0002\u0005"
z # => " \u0003"
puts x.length
puts y.length
puts z.length
# >> 3
# >> 3
# >> 2
你的代码是在字符串中创建二进制文件,而不是&#34;数字&#34;正如我们通常认为的那样,数字。
继续,您可以使用each_with_index
和case
/ when
来清理逻辑。为了使结果更具可读性,我从累积到字符串切换到数组:
users = (1..5).to_a
x = []
y = []
z = []
users.each_with_index do |i, count|
case count % 3
when 0
x << i
when 1
y << i
when 2
z << i
end
end
x # => [1, 4]
y # => [2, 5]
z # => [3]
puts x.length
puts y.length
puts z.length
# >> 2
# >> 2
# >> 1
真正的诀窍是使用%
,它对值进行模数计算。
答案 1 :(得分:1)
...如果每个字符串包含60个数字,我希望它附加到字符串中,直到没有更多的数字
如上所述,即使达到极限,您也无条件地追加x,y,z。 您需要在此代码周围添加条件:
$_POST['name'][0]
一旦达到你的限制就停止追加。
看起来没有做任何事情的其他区块,我认为你是朝这个方向前进的:
x << i if count == 1
y << i if count == 2
z << i if count == 3
但即便如此,也不会完全符合您的要求。 您需要检查要附加的字符串,看它是否已达到您的限制。
我建议重构以使其更清洁:
if x.length == 60
a << i if count == 1
a << i if count == 2
a << i if count == 3
else
x << i if count == 1
y << i if count == 2
z << i if count == 3
end
答案 2 :(得分:1)
在将数字推入这些变量时,最好使用数组而不是字符串。
让我提出一个解决方案,它或多或少地实现了你想要做的事情,但是使用了一些可能在将来有用的Ruby技巧。
x, y, z = r = Array.new(3) {[]}
a = []
iter = [0,1,2].cycle
(1..255).each do |i|
r.all? {|i| i.size == 60} ? a << i : r[iter.next] << i
end
p x.size, y.size, z.size
p a.size
让我们定义我们的数组。即使我有数组x
,y
和z
,它们只是因为它们存在于您的代码中 - 我认为我们只需要三个数组,每个数组都会收集数字因为它们是从一系列数字中挑选出来的 - 一个接一个地在1到255之间。 x,y,z = r
使用并行分配技术,相当于x,y,z = r[0],r[1],r[2]
。此外,使用Array.new(3) {[]}
有助于创建数组Array,以便在我们访问r[1]
时默认使用空数组[]
初始化它。
x, y, z = r = Array.new(3) {[]}
a = []
为了确定哪个数组必须放入从范围中选取的下一个数字,我们将使用从Enumerable#cycle
生成的枚举器。这个枚举器是特殊的 - 因为它本质上是无限的 - 我们可以通过调用next
继续要求它给出一个元素,它将循环遍历[0,1,2]
的数组元素 - 返回我们{ {1}}无限。
0,1,2,0,1,2,0,1,2...
接下来,我们将遍历数字范围1..255。在每次迭代期间,我们将在Enumerable#all?
的帮助下检查我们正在收集数字的所有3个数组是否具有所需的iter = [0,1,2].cycle
大小 - 如果是这样,我们会将数字附加到数组{{1 - 否则我们将根据60
枚举器返回的数组索引将其分配给a
的一个子数组。
r
最后,我们打印每个数组的大小。
iter