在Ruby 2.3.0中,当我rand.to_s[2..11].to_i
在ActiveRecord的循环中多次插入内容时,会验证length: {maximum: 10, minimum: 10}
。经过一些迭代,我得到一个错误,长度验证失败了!当我在同一场景中rand(1e9...1e10).to_i
时,它解决了问题。我想知道这两者之间有什么区别。
答案 0 :(得分:3)
Kernel#rand
在区间[0.0,1.0]中返回伪随机Float
。因此,它可以返回0.0
或0.123
这样的值,它们的字符串表示少于12个字符,因此,如果您使用"0.123"[2..11]
,则返回"123"
。
rand(range)
会在给定的Integer
中返回伪随机Range
,因此rand(1e9...1e10)
始终会返回一个整数有10位数的数字。
答案 1 :(得分:3)
#rand
会生成0到1之间的随机数。
这可以是0.01111111111111
。 to_s[2..12]
然后取小数点后的前10位数。
'01'.to_i # => 1
因此,您的长度可能小于10。