rand(1e9 ... 1e10).to_i和rand.to_s [2..11] .to_i之间的区别

时间:2017-03-14 07:48:51

标签: ruby ruby-on-rails-4 random maxlength

在Ruby 2.3.0中,当我rand.to_s[2..11].to_i在ActiveRecord的循环中多次插入内容时,会验证length: {maximum: 10, minimum: 10}。经过一些迭代,我得到一个错误,长度验证失败了!当我在同一场景中rand(1e9...1e10).to_i时,它解决了问题。我想知道这两者之间有什么区别。

2 个答案:

答案 0 :(得分:3)

没有参数的

Kernel#rand在区间[0.0,1.0]中返回伪随机Float。因此,它可以返回0.00.123这样的值,它们的字符串表示少于12个字符,因此,如果您使用"0.123"[2..11],则返回"123"

rand(range)会在给定的Integer中返回伪随机Range,因此rand(1e9...1e10)始终会返回一个整数有10位数的数字。

答案 1 :(得分:3)

不带参数的

#rand会生成0到1之间的随机数。

这可以是0.01111111111111to_s[2..12]然后取小数点后的前10位数。

'01'.to_i # => 1

因此,您的长度可能小于10。