如何为Luhn对象创建条件循环以检查index [0]是否不为0

时间:2015-03-04 19:47:41

标签: ruby luhn

我正在使用Github的Luhn lib。 Luhn课程有更多的方法,但我只是在"生成"和"有效吗?"方法

  m = Luhn.generate(9) # generates a random number like [123456789] or [098765432]
  Luhn.valid?(m)   # returns true or false based on Luhn checksum passing

但我不希望生成的号码以" 0"开头。

所以如何输入我的红宝石脚本:

  1. 丢弃以"0"开头的生成号码。
  2. 生成另一个号码并再次检查,直到m[0]为非零。
  3. 对生成的数字运行valid?():如果为false,则生成另一个非零数字,直到为真。
  4. 将有效的9位数字返回给来电者代码

1 个答案:

答案 0 :(得分:1)

这对你有用吗? (非常基本的递归)

require 'luhn'
def generate_non_zero_luhn(size=9)
  m = Luhn.generate(size)
  m[0] != "0" && Luhn.valid?(m) ? m : generate_non_zero_luhn(size)
end

示例输出

10.times.map { generate_non_zero_luhn }
#=> ["582428355", "353646136", "821379013", "818135220", "696652767", 
     "934766437", "885229401", "226319044", "682121645", "688197078"]

虽然我认为不需要进行有效性检查,因为Luhn正在生成数字,所以它始终有效。 e.g。

1_000_000.times.map { Luhn.valid?(Luhn.generate(9))}.any?{|val| !val}
#=> false

那么方法就可以成为

def generate_non_zero_luhn(size=9)
  m = Luhn.generate(size)
  m[0] != "0" ? m : generate_non_zero_luhn(size)
end