我写了一段代码,根据输入创建一个随机字符串。用户决定其长度以及是否应包含数字和特殊字符。我添加了一个故障保护例程,因为最终结果是随机的:
def create
i = @number
while i != 0
# testing the script I have noticed that the if statement is (always) ignored.
if i == 2 && (@word_bank.include?(@special_chars) && @rand_ary.include?(@special_chars) == false)
@rand_ary << @special_chars[rand(0..@special_chars.size - 1)]
end
letter = rand(0..word_bank.size - 1)
#puts "#{i}, #{word_bank[letter]}"
@rand_ary << word_bank[letter]
word_bank.delete_at(letter)
i -= 1
end
@rand_string = @rand_ary.join()
puts @rand_string
@rand_string
end
如果用户选择包含特殊字符,则计数器从n-0开始运行。当i = 2且不包含特殊字符数组中的字符时,将手动包含随机特殊字符。
但是从未触发此if
语句。我不知道为什么。
答案 0 :(得分:3)
如果您的变量具有我认为它们具有的那种值,那是因为include
不是在此处使用的正确方法。
如果@word_bank
和@rand_ary
是数组,则include
将检查是否有任何单个元素等于@special_chars
。如果@special_chars
本身是一个数组,则只有在@word_bank
/ @rand_ary
中的一个元素是数组时,它才会返回true。
['a', 'b', 'c', '!'].include?('!') # => true
['a', 'b', 'c', '!'].include?(['!']) # => false
['a', 'b', 'c', ['!']].include?(['!']) # => true
我认为您实际上对它们之间是否存在重叠感兴趣。在这种情况下,您可以使用交点(&
)运算符并检查其是否为空。
['a', 'b', 'c', '!'] & ['!'] # => ['!']
['a', 'b', 'c'] & ['!'] # => []