随机拉链方法

时间:2016-04-20 14:51:58

标签: ruby-on-rails arrays ruby random rspec

有没有办法随机使用zip method

如果这是我的代码

['top', 'left', 'z-index'].zip(['5px', '35px', '10']).each do |attribute, value|
  #not the actual code, just an example
  puts "#{attribute} is #{value}"
end

它将始终以相同的顺序打印:

  

顶部是5px
  左边是35px
  z-index是10

如果我shuffle数组,则元素将不匹配,因此它可能会打印

  

左边是5px

依旧......

我想要实现的是这一点,因为我在我的RSpec测试中使用它

第一次运行

  

顶部是5px
  左边是35px
  z-index是10

第二次运行

  

左边是35px
  顶部是5px
  z-index是10

3 个答案:

答案 0 :(得分:3)

如果您在shuffle之后应用zip该怎么办?

['top', 'left', 'z-index'].zip(['5px', '35px', '10']).shuffle.each do |attribute, value|
  #not the actual code, just an example
  puts "#{attribute} is #{value}"
end

每次运行时,您都会获得不同的输出。有时这个:

z-index is 10
left is 35px
top is 5px

有时这个:

left is 35px
z-index is 10
top is 5px

有时候那些相同的3行的其他排列

答案 1 :(得分:2)

您是否需要随机随机播放,请参阅@ user12341234提供的答案

是否要测试所有排列,请使用:

['top', 'left', 'z-index'].zip(['5px', '35px', '10'])
                          .permutation(3)
                          .each do |properties|
  properties.each do |attribute, value|
    #not the actual code, just an example
    puts "#{attribute} is #{value}"
  end
end

有关Array#permutation的更多信息。

答案 2 :(得分:1)

为什么使用Enumerable#zip创建中间数组?如果

a = ['top', 'left', 'z-index']
b = ['5px', '35px', '10']

编写更简单,更有效:

a.each_index.to_a.shuffle.each { |idx| puts "%s is %s" % [a[idx], b[idx]] }

打印

z-index is 10
left is 35px 
top is 5px

再次运行它可能会打印

top is 5px
z-index is 10
left is 35px