不触发条件语句

时间:2019-03-08 00:53:58

标签: ruby if-statement

我写了一段代码,根据输入创建一个随机字符串。用户决定其长度以及是否应包含数字和特殊字符。我添加了一个故障保护例程,因为最终结果是随机的:

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语句。我不知道为什么。

1 个答案:

答案 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'] & ['!'] # => []