在Ruby2.3.0中,当我使用rand.to_s[2..11].to_i在ActiveRecord中的循环中多次插入内容时,它会验证length: {maximum: 10, minimum: 10}。在一些迭代之后,我得到了一个错误,长度验证失败!当我在相同的场景中执行rand(1e9...1e10).to_i时,问题就解决了。我想知道这两个有什么不同。
发布于 2017-03-14 16:02:30
不带参数的#rand会生成一个介于0和1之间的随机数。
这可以是0.01111111111111。然后,to_s[2..12]取小数点后的前10位。
'01'.to_i # => 1因此,您可能会得到小于10的长度。
发布于 2017-03-14 15:59:16
不带参数的Kernel#rand返回区间[0.0,1.0]内的伪随机Float。因此,它可以返回像0.0或0.123这样的值,它们的字符串表示少于12个字符,所以,如果您采用"0.123"[2..11],它将返回"123"。
rand(range)返回给定Range中的伪随机Integer,因此rand(1e9...1e10)总是返回整数部分为10位的数字。
https://stackoverflow.com/questions/42780403
复制相似问题